1 Theory, Practice & Methodology of Relational Database Design and Programming Copyright © Ellis Cohen 2002-2008 Specifying & Enforcing Transition Constraints.

Slides:



Advertisements
Similar presentations
Relational Database Design UNIT II 1. 2 Advantages of Using Database Systems Centralized control of a firm’s data Redundancy can be reduced (avoid keeping.
Advertisements

Relational Database. Relational database: a set of relations Relation: made up of 2 parts: − Schema : specifies the name of relations, plus name and type.
Manipulating Data Schedule: Timing Topic 60 minutes Lecture
Fall 2005 ICS184/EECS116 – Notes 08 1 ICS 184/EECS116: Introduction to Data Management Lecture Note 8 SQL: Structured Query Language -- DDL.
SQL Constraints and Triggers
1 Theory, Practice & Methodology of Relational Database Design and Programming Copyright © Ellis Cohen Extended SQL & The Relational Calculus.
Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Chapter 5 More SQL: Complex Queries, Triggers, Views, and Schema Modification.
Candidate Keys Objectives of the Lecture : To consider Integrity Constraints; To consider the principles of Candidate Keys; To consider Candidate Keys.
Triggers The different types of integrity constraints discussed so far provide a declarative mechanism to associate “simple” conditions with a table such.
Introduction to Structured Query Language (SQL)
Copyright  Oracle Corporation, All rights reserved. 9 Manipulating Data: INSERT, UPDATE, DELETE.
CMPT 354, Simon Fraser University, Fall 2008, Martin Ester 157 Database Systems I SQL Constraints and Triggers.
1 Theory, Practice & Methodology of Relational Database Design and Programming Copyright © Ellis Cohen Introduction to Objects & Databases These.
Cursor and Exception Handling By Nidhi Bhatnagar.
RAJIKA TANDON DATABASES CSE 781 – Database Management Systems Instructor: Dr. A. Goel.
1 Theory, Practice & Methodology of Relational Database Design and Programming Copyright © Ellis Cohen M:N Relationships & Bridge Classes These.
1 Theory, Practice & Methodology of Relational Database Design and Programming Copyright © Ellis Cohen Enforcing Access Constraints with Privileges.
Lecture 7 Integrity & Veracity UFCE8K-15-M: Data Management.
1 Theory, Practice & Methodology of Relational Database Design and Programming Copyright © Ellis Cohen Advanced Normalization These slides are.
1 Theory, Practice & Methodology of Relational Database Design and Programming Copyright © Ellis Cohen :1 Relationships These slides are licensed.
1 Theory, Practice & Methodology of Relational Database Design and Programming Copyright © Ellis Cohen Introduction to Relational Databases &
1 Theory, Practice & Methodology of Relational Database Design and Programming Copyright © Ellis Cohen Cursors These slides are licensed under.
1 ICS 184: Introduction to Data Management Lecture Note 11: Assertions, Triggers, and Index.
DATABASE TRANSACTION. Transaction It is a logical unit of work that must succeed or fail in its entirety. A transaction is an atomic operation which may.
1 Theory, Practice & Methodology of Relational Database Design and Programming Copyright © Ellis Cohen Enforcing State & Transition Constraints.
1 Theory, Practice & Methodology of Relational Database Design and Programming Copyright © Ellis Cohen Maintaining Session State in the Data.
6 1 Lecture 8: Introduction to Structured Query Language (SQL) J. S. Chou, P.E., Ph.D.
Triggers. Why Triggers ? Suppose a warehouse wishes to maintain a minimum inventory of each item. Number of items kept in items table Items(name, number,...)
Database Systems Design, Implementation, and Management Coronel | Morris 11e ©2015 Cengage Learning. All Rights Reserved. May not be scanned, copied or.
1 Theory, Practice & Methodology of Relational Database Design and Programming Copyright © Ellis Cohen Relational Mapping with Constraints &
1 Theory, Practice & Methodology of Relational Database Design and Programming Copyright © Ellis Cohen Conditions & Roles These slides are licensed.
Fall 2001Database Systems1 Triggers Assertions –Assertions describe rules that should hold for a given database. –An assertion is checked anytime a table.
1 Theory, Practice & Methodology of Relational Database Design and Programming Copyright © Ellis Cohen Relational State Constraints These slides.
Constraints and Triggers. What’s IC? Integrity Constraints define the valid states of SQL-data by constraining the values in the base tables. –Restrictions.
Chapter 9 Logical Database Design : Mapping ER Model To Tables.
1 Theory, Practice & Methodology of Relational Database Design and Programming Copyright © Ellis Cohen Maintaining Session State in the Data.
Topics Related to Attribute Values Objectives of the Lecture : To consider sorting relations by attribute values. To consider Triggers and their use for.
1 Theory, Practice & Methodology of Relational Database Design and Programming Copyright © Ellis Cohen Implementing The Middle Tier These slides.
9 Manipulating Data. 9-2 Objectives At the end of this lesson, you should be able to: Describe each DML statement Insert rows into a table Update rows.
1 CS 430 Database Theory Winter 2005 Lecture 4: Relational Model.
1 Theory, Practice & Methodology of Relational Database Design and Programming Copyright © Ellis Cohen Subqueries These slides are licensed under.
Insert & Delete Objectives of the Lecture : To consider the insertion of tuples into a relation; To consider the deletion of tuples from a relation; To.
1 Theory, Practice & Methodology of Relational Database Design and Programming Copyright © Ellis Cohen Object-Relational Database Programming.
1 Theory, Practice & Methodology of Relational Database Design and Programming Copyright © Ellis Cohen Using Data Structures in Embedded Programs.
1 Theory, Practice & Methodology of Relational Database Design and Programming Copyright © Ellis Cohen Views These slides are licensed under.
1 Theory, Practice & Methodology of Relational Database Design and Programming Copyright © Ellis Cohen Relational State Assertions These slides.
1 Theory, Practice & Methodology of Relational Database Design and Programming Copyright © Ellis Cohen Collection Operators These slides are.
1 Theory, Practice & Methodology of Relational Database Design and Programming Copyright © Ellis Cohen Grouping These slides are licensed under.
1 Theory, Practice & Methodology of Relational Database Design and Programming Copyright © Ellis Cohen Collection Operators These slides are.
1 Theory, Practice & Methodology of Relational Database Design and Programming Copyright © Ellis Cohen Specifying & Enforcing Access Constraints.
1 Theory, Practice & Methodology of Relational Database Design and Programming Copyright © Ellis Cohen Roles & Constraints These slides are licensed.
Copyright س Oracle Corporation, All rights reserved. 12 Creating Views.
1 Theory, Practice & Methodology of Relational Database Design and Programming Copyright © Ellis Cohen Inner Joins These slides are licensed.
IMS 4212: Constraints & Triggers 1 Dr. Lawrence West, Management Dept., University of Central Florida Stored Procedures in SQL Server.
Constraints and Views Chap. 3-5 continued (7 th ed. 5-7)
LECTURE TWO Introduction to Databases: Data models Relational database concepts Introduction to DDL & DML.
Murali Mani Constraints. Murali Mani Keys: Primary keys and unique CREATE TABLE Student ( sNum int, sName varchar (20), dept char (2), CONSTRAINT key.
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke1 The Relational Model Chapter 3.
1 CS122A: Introduction to Data Management Lecture #4 (E-R  Relational Translation) Instructor: Chen Li.
1. Advanced SQL Functions Procedural Constructs Triggers.
Chapter 6: Integrity (and Security)
Chapter 6 - Database Implementation and Use
Constraints and Triggers
Database Construction (and Usage)
Writing Correlated Subqueries
What Is a View? EMPNO ENAME JOB EMP Table EMPVU10 View
Copyright © Ellis Cohen Consistency & Initialization
SQL – Constraints & Triggers
Copyright © Ellis Cohen
Copyright © Ellis Cohen Enforcing State Constraints
Presentation transcript:

1 Theory, Practice & Methodology of Relational Database Design and Programming Copyright © Ellis Cohen Specifying & Enforcing Transition Constraints These slides are licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License. For more information on how you may use them, please see

2 © Ellis Cohen Overview of Lecture Transition Constraints Transitionalized Relations Transition Assertions Specialized Transition Predicates Relational Transition Constraints Enforcing Transition Constraints Application-Enforced Rejection Rejection & Rollback Application-Enforced Correction Deletion Integrity Constraints Two-Phase Enforcement Enforcing Operation-Independent Transition Constraints Cascading Enforcement Specifying Output-Related Post Conditions Full Transition Assertions

3 © Ellis Cohen Transition Constraints

4 © Ellis Cohen Kinds of System Constraints State Constraints Specifies constraints on the state of the system an invariant property of the database state (something that must always be true and must be able to be checked at ANY ARBITRARY TIME!) Behavior Constraints Specifies constraints on the behavior of the system transition constraints access constraints

5 © Ellis Cohen Behavior Constraints Transition Constraint Characterizes the results to be produced by specified operations or changes Access Constraint Specifies constraints on what a user or operation is permitted to do

6 © Ellis Cohen Generalizing Post-Conditions A Transition Constraint is either a –post-condition –generalized post-condition Two ways to generalize post-conditions Operation-dependent condition for a group of operations, rather than just a specific one Operation-independent condition which doesn’t refer to operations at all, but is just based on database/user/environment

7 © Ellis Cohen Conceptual & Relational Constraints Conceptual Constraint A system constraint, often written informally, in terms of a conceptual model (about entity classes, not tables!) Relational Constraint A system constraint written (often more formally, e.g. using SQL), in terms of a relational model (i.e. tables)

8 © Ellis Cohen Transition Constraints Conceptual Transition Constraints Describe side effects, in plain language, in terms of the conceptual model Relational Transition Constraints Describe side effects, written in a formal SQL-like language, in terms of the relational model

9 © Ellis Cohen Transitionalized Relations (a non-standard SQL extension!)

10 © Ellis Cohen Database-Related Transition Assertions A transition assertion describes a way in which an operation changes the database state To write a Transition Assertion We need to be able to distinguish the state of tables in the database –before execution –after execution

11 © Ellis Cohen Transitionalized Relations Emps Emps& Refers to the state of the Emps table at a particular point in time Refers to the state of the Emps table at two distinct points in time the time just before execution of an action the time just after execution of an action Execution Emps( empno, ename, job, sal ) Emps& has a tuple for every tuple that was in Emps before or after execution

12 © Ellis Cohen Update Action empno' ename' job' sal' 6154 SMITH CLERK SMITH CLERK 1340 empno 6154 Emps&( empno, empno', ename', job', sal', ) UPDATE Emps SET sal = sal WHERE empno = 6154 If (SELECT e.sal' FROM Emps& e WHERE empno = 6154) = 1100 Then (SELECT FROM Emps& e WHERE empno = 6154) = 1340 Attribute(s) for primary key(s) BEFORE AFTER

13 © Ellis Cohen Delete Action empno' ename' job' sal' 6154 SMITH CLERK NULL NULL NULL NULL empno 6154 Emps&( empno, empno', ename', job', sal', ) DELETE FROM Emps WHERE empno = 6154 If the action is the DELETE above, then (SELECT FROM Emps& e WHERE empno = 6154) IS NULL (SELECT FROM Emps& e WHERE empno = 6154) IS NULL BEFORE AFTER

14 © Ellis Cohen Insert Action empno' ename' job' sal' NULL NULL NULL NULL CODY ANALYST 2300 empno 3175 Emps&( empno, empno', ename', job', sal', ) INSERT INTO Emps VALUES( 3175, 'CODY', 'ANALYST', 2300 ) If the action is the INSERT above, then (SELECT e.empno' FROM Emps& e WHERE empno = 3175) IS NULL (SELECT e.sal' FROM Emps& e WHERE empno = 3175) IS NULL BEFORE AFTER

15 © Ellis Cohen Transitionalized Relation Problem Suppose the action is defined as BEGIN INSERT INTO Emps( empno, job, sal ) VALUES( 2468, 'PEON', 650 ); UPDATE Emps SET sal = 2500 WHERE empno = 6519; DELETE FROM Emps WHERE empno = 8718; END; Emps& Fill in the table below. Make up values where needed

16 © Ellis Cohen Transitionalized Relation Solution 1615 'CLERK' NULL 2468 NULL 'PEON' NULL 'ANALYST' NULL 'WRITER' NULL 1600 NULL Emps& Note: changing the value of a primary key (which is a bad idea anyway) is treated as a delete of a tuple (with its original key value) combined with an insert of a tuple (with the new key value) Pink cells have made-up values Blue cells have values determined by the made-up values White cells have values determined by the action

17 © Ellis Cohen Transitionalized PK NULL Comparisons What group of employees are represented by SELECT e.empno FROM Emps& e WHERE e.empno' IS NOT NULL  employees employed before the action SELECT e.empno FROM Emps& e WHERE IS NOT NULL SELECT e.empno FROM Emps& e WHERE e.empno' IS NULL SELECT e.empno FROM Emps& e WHERE IS NULL

18 © Ellis Cohen Groups of Employees SELECT e.empno FROM Emps& e WHERE e.empno' IS NOT NULL  employees employed before the action SELECT e.empno FROM Emps& e WHERE IS NOT NULL  employees employed after the action SELECT e.empno FROM Emps& e WHERE e.empno' IS NULL  employees hired by the action SELECT e.empno FROM Emps& e WHERE IS NULL  employees terminated by the action

19 © Ellis Cohen Transition Assertions

20 © Ellis Cohen Transition Assertions A transition assertion is a boolean (i.e. true/false) extended SQL expression that uses –transitionalized relations (Emps&) –operation parameters, when used with an operation-dependent transition constraint context NOT EXISTS (SELECT * FROM Emps& WHERE = :deptno) NO Emps& e SATISFIES = :deptno No employees are left in department :deptno

21 © Ellis Cohen Example Transition Assertion No employee that was in department 20 is still in department 20 NO Emps& e WHERE e.deptno' = 20 SATISFIES = 20 NOT EXISTS (SELECT * FROM Emps& e WHERE e.deptno’ = 20 AND = 20) All employees that were in department 20 have been moved to department 10 EACH Emps& e WHERE e.deptno' = 20 SATISFIES = 10 NOT EXISTS (SELECT * FROM Emps& e WHERE e.deptno’ = 20 AND != 10 OR IS NULL) )

22 © Ellis Cohen Transition Assertion Exercise All employees that were in department 20 are now unassigned Write transition assertions that correspond to the following: All employees that were in department 20 are no longer employed

23 © Ellis Cohen Terminated Employees EACH Emps& e WHERE e.deptno' = 20 SATISFIES IS NULL NOT EXISTS (SELECT * FROM Emps& WHERE e.deptno’ = 20 AND IS NOT NULL) All employees that were in department 20 are no longer employed

24 © Ellis Cohen Unassigned Employees EACH Emps& e WHERE e.deptno' = 20 SATISFIES IS NULL AND IS NOT NULL NOT EXISTS (SELECT * FROM Emps& WHERE e.deptno’ = 20 AND IS NOT NULL OR IS NULL)) All employees that were in department 20 are now unassigned

25 © Ellis Cohen Lifetime Dependency Exercise Employees in departments that were destroyed are no longer employed Write the transition assertion Hint: It can be written either as EACH Emps& e WHERE … SATISFIES … (using a vector subquery) or EACH Depts& d WHERE … SATISFIES … (using a nested EACH subquery)

26 © Ellis Cohen Lifetime Dependency EACH Depts& d WHERE IS NULL SATISFIES (EACH Emps& e WHERE d.deptno' = e.deptno' SATISFIES IS NULL ) EACH Emps& e WHERE e.deptno' IN (SELECT d.deptno FROM Depts& d WHERE IS NULL ) SATISFES IS NULL Employees that were in departments that were destroyed are no longer employed

27 © Ellis Cohen Affected Tuples Exercise All employees who reported to removed department managers now report to the president (employee #7839) instead. Write the transition assertion

28 © Ellis Cohen Affected Tuples Answer EACH Emps& m WHERE m.job' = 'DEPTMGR' AND <> 'DEPTMGR' OR IS NULL) SATISFIES (EACH Emps& e WHERE e.mgr' = m.empno' SATISFIES = 7839)

29 © Ellis Cohen Specialized Transition Predicates

30 © Ellis Cohen Using Insert & Delete Predicates Predefined Transition Predicates (if pk is the primary key of the table x refers to) x IS DELETED IS NULL x IS NOT DELETED IS NOT NULL x IS INSERTED x.pk' IS NULL x IS NOT INSERTED x.pk' IS NOT NULL So, if e is anEmployee:e IS IS NULL

31 © Ellis Cohen Delete Predicate Examples EACH Emps& e WHERE e.deptno' = 20 SATISFIES e IS DELETED All employees that were in department 20 are no longer employed EACH Emps& e WHERE e.deptno' = 20 SATISFIES IS NULL AND e IS NOT DELETED All employees that were in department 20 are now unassigned EACH Depts& d WHERE d IS DELETED SATISFIES (EACH Emps& e WHERE d.deptno' = e.deptno' SATISFIES e IS DELETED) Employees that were in departments that were destroyed are no longer employed

32 © Ellis Cohen Predefined Modified Predicates x IS MODIFIED AT attr (e.attr' != OR (e.attr' IS NULL AND IS NOT NULL) OR (e.attr' IS NOT NULL AND IS NULL) x IS MODIFIED AT a1, …, an (x IS MODIFIED AT a1) OR … (x IS MODIFIED At an) x IS MODIFIED means that some of x's attributes are modified -- Note: If x is either INSERTED OR DELETED then X is also MODIFIED x IS MODIFIED EXCEPT AT a1, …, an means that some of x's attributes (other than a1, …, an) are modified

33 © Ellis Cohen Predefined Updated Predicate x IS UPDATED AT attr (x IS MODIFIED AT attr) AND (x IS NOT INSERTED) AND (x IS NOT DELETED) x IS UPDATED AT a1, …, an (x IS MODIFIED AT a1, …, an) AND (x IS NOT INSERTED) AND (x IS NOT DELETED) x IS UPDATED (x IS MODIFIED) AND (x IS NOT INSERTED) AND (x IS NOT DELETED) x IS UPDATED EXCEPT AT a1, …, an (x IS MODIFIED EXCEPT AT a1, …, an) AND (x IS NOT INSERTED) AND (x IS NOT DELETED)

34 © Ellis Cohen Predefined Unchanged Predicates (opposite of Modified Predicates) x IS UNCHANGED AT attr (e.attr' = OR (e.attr' IS NULL AND IS NULL) x IS UNCHANGED AT a1, …, an (x IS UNCHANGED AT a1) AND … (x IS UNCHANGED AT an) x IS UNCHANGED means that all of x's attributes are unchanged x IS UNCHANGED EXCEPT AT a1, …, an means that all of x's attributes (other than a1, … an) are unchanged

35 © Ellis Cohen Using Unchanged EACH Depts& d WHERE d IS NOT DELETED SATISFIES (EACH Emps& e WHERE d.deptno' = e.deptno' SATISFIES e IS UNCHANGED) Employees in departments that were not deleted are unaffected by the action

36 © Ellis Cohen Relational Transition Constraints

37 © Ellis Cohen Example Transition Constraint + Conceptual Transition Constraint: As a result of executing FiddleWithDept(:deptno ), department :deptno is left without employees FiddleWithDept( :deptno ) RESULTS IN NO Emps& e SATISFIES = :deptno Relational Transition Constraint Translation: After executing FiddleWithDept( :deptno ), consider all the employees (who were employees either before or after the operation was executed). None of them has a value for deptno at the end of the operation that is equal to :deptno

38 © Ellis Cohen Transition Constraints & Assertions RESULTS IN RESULTS IN The Transition Assertion may reflect –the state preceding the operation(s) –the state following the operation(s) using transitionalized relations (Emps&) When the constraint context is a specific operation or list of operations with parameters, the transition assertion can refer to those parameters We are mostly interested in writing transition constraints for user actions but they can also be written for database actions or procedures in any layer of the implementation

39 © Ellis Cohen Relational Transition Constraint FiddleWithDept( :deptno ) RESULTS IN NO Emps& e SATISFIES = :deptno Constraint Context: Circumstances in which some side effect is supposed to happen Transition Assertion: Formal description of the side effect

40 © Ellis Cohen Example Constraint Contexts A specific user operation TerminateEmp( :empno ) A list of specific user operations TerminateEmp( :empno ), DestroyDept( :deptno, :reldept ) Any operation/query/action ANY ACTION Any operation/query/action for some role ANY OPERATION BY DeptMgr Operation-based contexts with exceptions ANY OPERATION EXCEPT (ANY QUERY BY Employee) Table-based UPDATE OF job ON Emps Operation- Dependent Operation- Independent

41 © Ellis Cohen Enforcing Transition Constraints

42 © Ellis Cohen Use of Transition Constraints Documentation The transition constraint simply documents what the code is expected to already do Can be used for code inspection and validation Enforcement Add code that ensures that the system actually satisfies the constraint

43 © Ellis Cohen Enforcement Approaches (for both existing code & new business rules) Correction: Add code which corrects the database state, so that the constraint becomes enforced  Transition constraints are almost always enforced by correction. Rejection: Add code which checks whether the constraint is enforced. If not, raise an exception!

44 © Ellis Cohen Purpose of Enforcement Error Detection & Correction of Existing System Add code to detect and/or correct implementation errors in enforcing existing business rules Support New Business Rules Support new business rules added after an application has already been built

45 © Ellis Cohen Correction Variations Enforcement by correction can take many forms. Suppose we want to enforce (by correction) the transition constraint associated with some specific action operation Every newly added employee in dept 10 has a salary > 600 How might we add code to the operation to enforce the constraint?

46 © Ellis Cohen Correction Alternatives Graceful correction: If the employee has been added to dept 10 with a salary < 600, reset it to 600 Heavy-handed correction: If the employee has been added to dept 10 with a salary < 600, move them to dept 66 (the PARTY dept) Heavy-handed correction may still be better than rejection, which won't allow the employees to be inserted at all (since the action will be rolled back) Every newly added employee in dept 10 has a salary > 600

47 © Ellis Cohen Mixed Approaches Correction & Rejection are just ends of a spectrum. Mixed Approaches do a combination of these -- e.g. Try graceful correction If some tuples can't be gracefully corrected, try heavy-handed correction for those If some tuples can't be corrected at all, reject the operation (or allow it, but notify the DBA about the problems)

48 © Ellis Cohen Transition Constraint Specificity More specific transition constraints give the developer less leeway in deciding what kind of correction to use: Less specific constraint Every newly added employee is placed in some department other than the largest one More specific constraint Every newly added employee is placed in department 10

49 © Ellis Cohen Enforcing Transition Constraints There are two places to enforce transition constraints Application Enforcement: Enforce transition constraints through code implemented in user actions (in the middle-tier) or stored DB actions (in the data-tier) Database Enforcement: Use built-in database features to automatically enforce transition constraints in the data-tier triggers & on delete

50 © Ellis Cohen Application-Based Enforcement White Box Enforcement –Look at the code of each relevant operation, and modify it in the best possible way to enforce the constraint Black Box Enforcement –Leave the basic operation code alone (except to place information in local variables from modified tuples using RETURNING clauses) –Add code after the base modification code of each relevant operation to enforce the constraint –May also need to add code before the existing code to handle setup for the after code –In some cases, it's possible to place all the enforcement code before the base modification code

51 © Ellis Cohen Why Black Box Enforcement? Supports different developers maintaining base code and constraints Increases maintainability overall Simplifies cases where the constraints (which reflect business rules) are likely to change. Supports reusability if the same kind of enforcement needs to be done in multiple operations Simplifies switching to trigger-based enforcement

52 © Ellis Cohen Application-Enforced Rejection

53 © Ellis Cohen Example Transition Constraint As a result of executing FiddleWithDept(:deptno ), department :deptno is left without employees FiddleWithDept( :deptno ) RESULTS IN NO Emps& e SATISFIES = :deptno

54 © Ellis Cohen Enforcement By Rejection Why are we enforcing this by rejection? 1) We expect that the base code of FiddleWithDept leaves the department empty, but we want to check that, and do so by rejection. 2) This is a new business rule relating to FiddleWithDept. For now, we choose to enforce it by rejection (it’s simpler) Enforcement by Rejection: If the constraint fails, we don't want the changes made by FiddleWithDept to persist

55 © Ellis Cohen Black Box Rejection BEGIN … the code to fiddle the dept is here … but too complicated to show -- now, check if it was done correctly, -- else raise an exception FOR rec IN (SELECT empno FROM Emps WHERE deptno = :deptno) LOOP RAISE_APPLICATION_ERROR( , 'Department ' || :deptno || ' is not empty' ); END LOOP; END; FiddleWithDept( :deptno ) Note this code could instead count how many employees are left in Emps. What would that look like? Black Box Rejection Code

56 © Ellis Cohen Rejection Using Counting DECLARE knt int; BEGIN … the code to fiddle the dept is here … but too complicated to show -- now, check if it was done correctly, -- else raise an exception SELECT count(*) INTO knt FROM Emps WHERE deptno = :deptno; IF knt > 0 THEN RAISE_APPLICATION_ERROR( , 'Department ' || :deptno || ' is not empty' ); END IF; END; FiddleWithDept( :deptno )

57 © Ellis Cohen Rejection & Rollback

58 © Ellis Cohen Rejection and Rollback Raising an exception will only rollback the action (i.e. unfiddle) if it is propagated out of the database server. If the exception is caught (e.g. to display output), then unfiddling will not happen! Ensuring rollback requires either that The exception is not caught within code executed within the database, or If the exception is caught, an explicit ROLLBACK (or RAISE) is done

59 © Ellis Cohen Rejection w Explicit Rollback BEGIN … the code to fiddle the dept is here … but too complicated to show -- now, check if it was done correctly, -- else raise an exception FOR rec IN (SELECT empno FROM Emps WHERE deptno = :deptno) LOOP ROLLBACK; pl( 'Department ' || :deptno || ' is not empty' ); EXIT; END LOOP; END; FiddleWithDept( :deptno ) What happens if an exception is raised by the base code to fiddle a dept? With AUTO- COMMIT ON

60 © Ellis Cohen Consistent Exception Handling BEGIN … the code to fiddle the dept is here … but too complicated to show -- now, check if it was done correctly, -- else raise an exception FOR rec IN (SELECT empno FROM Emps WHERE deptno = :deptno) LOOP RAISE_APPLICATION_ERROR( , 'Department ' || :deptno || ' is not empty' ); END LOOP; EXCEPTION WHEN OTHERS THEN doerr(); END; FiddleWithDept( :deptno ) Displays the error information and does the ROLLBACK 1) Ensures all exceptions are handled consistently 2) Separates identification of errors from way that they are reported to the user (e.g. using HTML) With AUTO- COMMIT ON

61 © Ellis Cohen Reusable Enforcement Procedure PROCEDURE CheckDeptEmpty( aDeptno int ) IS BEGIN FOR rec IN (SELECT empno FROM Emps WHERE deptno = aDeptno) LOOP RAISE_APPLICATION_ERROR( , 'Department ' || aDeptno || ' is not empty' ); END LOOP; END; FiddleWithDept( :deptno ) BEGIN … the code to fiddle the dept is here … but too complicated to show CheckDeptEmpty( :deptno ); EXCEPTION WHEN OTHERS THEN doerr(); END; Define a reusable procedure that can be used in any operation to check whether a dept is empty Displays the error information and does the ROLLBACK

62 © Ellis Cohen Standard Error Handling Routine PROCEDURE doerr IS endpos int; startpos int; len int; str varchar2(400); BEGIN startpos := 2 + instr( SQLERRM, ':' ); endpos := instr( SQLERRM, chr(10), startpos ); len := endpos - startpos; IF endpos = 0 THEN str := substr( SQLERRM, startpos ); ELSE str := substr( SQLERRM, startpos, len ); END IF; pl( '--> ERROR: ' || str ); ROLLBACK; END; In addition to rolling back the transaction, it extracts useful information from the exception string, and prints it out

63 © Ellis Cohen Application-Enforced Correction

64 © Ellis Cohen Correction BEGIN … the code to fiddle the dept is here … but way too complicated to show -- now, delete any employees still in the dept DELETE FROM Emps WHERE deptno = :deptno; EXCEPTION WHEN OTHERS THEN doerr(); END; FiddleWithDept( :deptno ) Correct by simply deleting any employees left in dept :deptno As a result of executing FiddleWithDept(:deptno ), department :deptno is left without employees (even if the department itself still exists) Place the correcting code in a stored procedure instead if it is complicated & can be reused by multiple operations Is there a more graceful approach?

65 © Ellis Cohen Graceful Correction BEGIN … the code to fiddle the dept is here … but way too complicated to show -- now, deassign any employees still in the dept UPDATE Emps SET deptno = NULL WHERE deptno = :deptno; EXCEPTION WHEN OTHERS THEN doerr(); END; FiddleWithDept( :deptno ) Correct by deassigning employees As a result of executing FiddleWithDept(:deptno ), department :deptno is left without employees

66 © Ellis Cohen Enforcement Problem What code would you add to UpdateSalaries to enforce this operation-specific transition constraint (i.e. post-condition) by Rejection or Correction UpdateSalaries( :vary ) BEGIN … updates the salaries of employee in some way … which depends upon :vary EXCEPTION WHEN OTHERS THEN doerr(); END; Suppose the post-condition JUST for this operation requires that no clerk end up with a salary less than $400

67 © Ellis Cohen Black Box Rejection BEGIN … the code to update salaries would be here FOR rec IN (SELECT empno FROM Emps WHERE job = 'CLERK' AND sal < 400) LOOP RAISE_APPLICATION_ERROR( , 'Oops! Underpaid Clerks'); END LOOP; EXCEPTION WHEN OTHERS THEN doerr(); END; UpdateSalaries( :vary ) If the application error is raised, it will be caught and doerr() will be called, which will rollback the update print the error information

68 © Ellis Cohen Black Box Correction BEGIN … the code to update salaries would be here UPDATE Emps SET sal = 400 WHERE job = 'CLERK' AND sal < 400; EXCEPTION WHEN OTHERS THEN doerr(); END; UpdateSalaries( :vary ) So, if UpdateSalaries added :vary pct to every employee's salary (:vary can be negative!) what would the code be?

69 © Ellis Cohen Corrective Solution with All Code BEGIN UPDATE Emps SET sal = sal * :vary / 100; UPDATE Emps SET sal = 400 WHERE job = 'CLERK' AND sal < 400; EXCEPTION WHEN OTHERS THEN doerr(); END; UpdateSalaries( :vary ) Base Code Corrective Code Suppose there is a CHECK constraint which checks that all employees have a salary > $350 What will happen if the first UPDATE statement leads to a CLERK having a salary of $340 (even though the second UPDATE statement will reset the salary to $400)?

70 © Ellis Cohen Deferred Constraints CREATE TABLE Emps( empnoint primary key, enamevarchar(30) not null, salnumber(8,2) CHECK( sal > 350 ) INITIALLY DEFERRED, deptnoint references Depts ) Declaring a constraint to be INITIALLY DEFERRED means that any checks that would be made in the middle of a transaction are deferred until the end of the transaction (actually they are re-checked) So if a employee's salary if set to 340 by one statement in an operation, but then reset to 400 by the end of the transaction, no error would be raised.

71 © Ellis Cohen White Box Correction BEGIN UPDATE Emps SET sal = CASE WHEN job = 'CLERK' AND (sal * :vary / 100) < 400 THEN 400 ELSE (sal * :vary / 100) END; EXCEPTION WHEN OTHERS THEN doerr(); END; UpdateSalaries( :vary ) Avoids need for two updates and for deferred checking

72 © Ellis Cohen White vs Black Box Comparison Performance One update statement requires one full scan through the employees table Two update statements (assuming no index on sal or job) requires two full scans Usability & Maintainability One update statement is often (but not always) harder to read & to maintain Separating the two cleanly separates the base & enforcement code

73 © Ellis Cohen Corresponding Relational Constraint UpdateSalaries( :vary ) RESULTS IN EACH Emps& e WHERE = 'CLERK' SATISFIES >= 400 Transition Assertion: After UpdateSalaries, every clerk's salary is 400 or more How is the constraint related to the enforcement code?

74 © Ellis Cohen Deletion Integrity Constraints

75 © Ellis Cohen Deletion Integrity Constraints Deletion Integrity Constraint: a conceptual transition constraint which specifies how to handle the children of a parent entity which has been deleted. Special Deletion Integrity Constraints (supported directly by SQL) Lifetime Dependency Constraint: When an entity (e.g. an invoice) is deleted, all of its children (e.g. its entries) are deleted as well Deassignment Constraint: When an entity (e.g. a department) is deleted, all of its children (e.g. its employees) become unassigned (i.e. not associated with any department)

76 © Ellis Cohen Conceptual Model With Lifetime Dependency Constraint DeptEmployee works for deptno dname empno ename sal location + Conceptual Transition Constraint When a department is deleted, all employees in that department are deleted Doesn't need to be stated explicitly: The constraint is visually represented by the dependent relationship. Lifetime Dependency Constraint

77 © Ellis Cohen CREATE TABLE Emps( empnoint primary key, enamevarchar(30) not null, salnumber(8,2), deptnoint references Depts ON DELETE CASCADE ) Relational Model With Lifetime Dependency Constraint Lifetime Dependency Constraints are supported directly by the relational model

78 © Ellis Cohen Conceptual Model With Deassignment DeptEmployee works for deptno dname empno ename sal location + Conceptual Transition Constraint When a department is deleted, all employees in that department become unassigned Deassignment Constraint

79 © Ellis Cohen CREATE TABLE Emps( empnoint primary key, enamevarchar(30) not null, salnumber(8,2), deptnoint references Depts ON DELETE SET NULL ) Relational Model with Deassignment Deassignment Constraints are supported directly by the relational model

80 © Ellis Cohen Specialized Deletion Integrity Constraint (not directly supported by SQL) DeptEmployee works for deptno dname empno ename sal + Conceptual Transition Constraint When a department is deleted, all employees left in that department must be moved to dept 66 (the PARTY department, which we will assume is never deleted) General Deletion Integrity Constraint not supported directly by SQL

81 © Ellis Cohen Enforcement for Vandalize BEGIN -- Vandalize's complicated code is here -- It does lots of complicated stuff -- including possibly deleting some depts EXCEPTION WHEN OTHERS THEN doerr(); END; Vandalize There may be an number of operations which may delete departments. Let's consider enforcement of the constraint for one of them, Vandalize

82 © Ellis Cohen Graceful Enforcement Code BEGIN -- Vandalize's complicated code is here -- If dept was deleted, -- Move its employees to dept 66 UPDATE Emps SET deptno = 66 WHERE deptno NOT IN (SELECT deptno IN Depts) EXCEPTION WHEN OTHERS THEN doerr(); END; Vandalize Checks whether dept was deleted But how can a dept even be deleted if it still has employees (unless it has an ON DELETE clause, which would already handle its employee)?

83 © Ellis Cohen CREATE TABLE Emps( empnoint primary key, enamevarchar(30) not null, salnumber(8,2), deptnoint references Depts INITIALLY DEFERRED ) Using INITIALLY DEFERRED If a deletion integrity constraint involves ANY side effect that you intend to enforce after the base code, you must specify INITIALLY DEFERRED, to defer the referential integrity check until the end of the transaction, otherwise the deletion of the parent will not be allowed. Deferring it means it is re-checked at the end of the transaction (i.e. operation) by which time all of the employees in the deleted departments have been moved

84 © Ellis Cohen Two-Phase Enforcement

85 © Ellis Cohen Two-Phase Constraint Implementation Sometimes black box enforcement of a transition constraint requires two phases: 1.Collect information at the start of the action (in local variables, package variables, or temporary tables) 2.Use that information at the end of the action to figure out whether there is a violation, and if so, reject or correct.

86 © Ellis Cohen Two-Phase Enforcement Problem BEGIN … mucks with department :deptno … in some complicated way EXCEPTION WHEN OTHERS THEN doerr(); END; MuckWithDept( :deptno ) Suppose the post-condition for this operation requires that any employee that was in dept :deptno and that was not deleted, must be moved to department 10 (however MuckWithDept may add new employees to the department!)

87 © Ellis Cohen Relational Transition Constraint As a result of executing MuckWithDept(:deptno ), any employee that was in dept :deptno and that was not deleted, must be moved to department 10 MuckWithDept( :deptno ) RESULTS IN EACH Emps& e WHERE e.deptno' = :deptno AND e IS NOT DELETED SATISFIES = 10 How could this be enforced?

88 © Ellis Cohen Enforcement Approach If any employees that were in department :deptno are not either deleted or in dept 10 Rejection –raise an exception Heavy-handed correction –delete them Gentle correction –move them to department 10

89 © Ellis Cohen Two-Phase Implementation Before basic mucking: oremember all the employees that were in :deptno at the start of MuckWithDept After basic mucking: ocheck whether all those employees were reassigned to department 10. If not oIf rejecting, raise an exception oIf correcting, delete or move 'em! Enforcing this constraint requires knowing who was in department :deptno at the beginning of the operation

90 © Ellis Cohen Using Temporary Tables BEGIN INSERT INTO OldEmps SELECT empno FROM Emps WHERE deptno = :deptno; … the basic MuckWithDept code goes here UPDATE Emps e SET deptno = 10 WHERE empno IN ( SELECT empno FROM OldEmps); EXCEPTION WHEN OTHERS THEN doerr(); END; MuckWithDept( :deptno ) Does correction Assume OldEmps has been defined as a temporary table Remembers employees in dept :deptno

91 © Ellis Cohen Temporary Tables CREATE GLOBAL TEMPORARY TABLE OldEmps ( … ) ON COMMIT DELETE ROWS; ON COMMIT PRESERVE ROWS retains the session's data from transaction to transaction (just like permanent tables) ON COMMIT DELETE ROWS automatically empties the session's data at the end of every transaction (this is the default!) When you create a global temporary table, the definition of the table is persistent, but every session gets its own independent copy of the data in the table!

92 © Ellis Cohen Enforcement Question BEGIN INSERT INTO OldEmps SELECT empno FROM Emps WHERE deptno = :deptno; … the basic MuckWithDept code goes here UPDATE Emps e SET deptno = 10 WHERE empno IN ( SELECT empno FROM OldEmps); EXCEPTION WHEN OTHERS THEN doerr(); END; MuckWithDept( :deptno ) How would this code need to be changed if the post-condition were: any employee that was in dept :deptno must be moved to department 10

93 © Ellis Cohen Reject on Delete BEGIN INSERT INTO OldEmps SELECT empno FROM Emps WHERE deptno = :deptno; … the basic MuckWithDept code goes here FOR rec IN (SELECT empno FROM OldEmps MINUS SELECT empno FROM Emps) LOOP RAISE_APPLICATION_ERROR( , 'Employee ' || rec.empno || ' improperly deleted' ); END LOOP; UPDATE Emps e SET deptno = 10 WHERE empno IN ( SELECT empno FROM OldEmps); EXCEPTION WHEN OTHERS THEN doerr(); END; MuckWithDept( :deptno )

94 © Ellis Cohen Enforcing Operation-Independent Transition Constraints

95 © Ellis Cohen Generalizing Post-Conditions A Transition Constraint is either a –post-condition –generalized post-condition Two ways to generalize post-conditions Operation-dependent condition for a group of operations, rather than just a specific one Operation-independent condition which doesn’t refer to operations at all, but is just based on database/user/environment

96 © Ellis Cohen Implementing Operation-Independent Transition Constraints 1.Determine which operations can affect the transition constraint. 2.Add code (e.g. a call to a reusable procedure, especially if there is more than one) to each of them to enforce it.

97 © Ellis Cohen Example Enforcement General Transition Constraint RaiseDeptMgrSal: Whenever an existing employee is made a dept mgr, then their salary is increased by 10%. Operations Affected ChangeJob – changes job of an employee ChangePosition – changes dept/job/mgr of an employee

98 © Ellis Cohen Operation-Specific Relational Transition Constraint ChangeJob( :empno, :job ) ChangePosition( :empno, :deptno, :mgr, :job ) RESULTS IN EACH Emps& e WHERE e.empno = :empno AND e.job' <> 'DEPTMGR' AND :job = 'DEPTMGR' SATISFIES = e.sal' * 1.1

99 © Ellis Cohen Operation-Independent Relational Transition Constraint ANY ACTION RESULTS IN EACH Emps& e WHERE e.job' <> 'DEPTMGR' AND = 'DEPTMGR' SATISFIES = e.sal' * 1.1

100 © Ellis Cohen Enforcement Procedure -- raises salary of employee anEmpno -- by 10% PROCEDURE RaiseSal( anEmpno int ) IS BEGIN UPDATE Emps SET sal = sal *1.1 WHERE empno = anEmpno; END;

101 © Ellis Cohen Black Box Implementation ChangeJob( :empno, :job ) BEGIN … base code to change the employee's job... is here but not shown IF :job = 'DEPTMGR' THEN RaiseSal( :empno ); END IF; EXCEPTION WHEN OTHERS THEN doerr(); END; And similarly for ChangePosition Probably ought to also check that the job was not previously DEPTMGR. How?

102 © Ellis Cohen Checking Old Salary ChangeJob( :empno, :job ) DECLARE empjob Emps.job%TYPE; BEGIN empjob := GetJob( :empno ); … base code to change the employee's job... is here but not shown IF :job = 'DEPTMGR' AND empjob != 'DEPTMGR' THEN RaiseSal( :empno ); END IF; EXCEPTION WHEN OTHERS THEN doerr(); END; Gets employee's job Assumes job cannot be NULL

103 © Ellis Cohen Simplifying ChangeJob ChangeJob( :empno, :job ) DECLARE empjob Emps.job%TYPE; BEGIN empjob := GetJob( :empno ); … base code to change the employee's job... is here but not shown RaiseSal( :empno, :job, empjob ); EXCEPTION WHEN OTHERS THEN doerr(); END; Write a version of RaiseSal, which takes the old & new job as parameters, and moves the testing code out of ChangeJob

104 © Ellis Cohen Cascading Enforcement

105 © Ellis Cohen Cascading Enforcement If a constraint is enforced by correction, The correction code may itself be relevant to some other constraint So the correction code would itself need to enforce that other constraint!

106 © Ellis Cohen Enforcement Example General Transition Constraint SetNewDeptMgrOnLoss: Whenever a department loses its department manager, then the employee in the department (if any) who has been with the company the longest becomes the new dept manager. Operations Affected TerminateEmp – terminates an employee ChangeJob – changes job of an employee ChangePosition – changes dept and/or job and/or mgr of employee

107 © Ellis Cohen Black Box Implementation TerminateEmp( :empno ) DECLARE empdept int; ejob Emps.job%TYPE; BEGIN SELECT deptno, job INTO empdept, ejob FROM Emps WHERE empno = :empno; -- this could be combined with deleting :empno … base code to terminate the employee is … here, but not shown IF ejob = 'DEPTMGR' THEN SetNewDeptMgr ( empdept ); END; EXCEPTION WHEN OTHERS THEN doerr(); END;

108 © Ellis Cohen Cascading Example TerminateEmp, ChangePosition & ChangeJob can all result in loss of a DeptMgr  Call SetNewDeptMgr from each of them (to potentially promote an employee to dept mgr) SetNewDeptMgr can promote an employee to a dept mgr  Call RaiseSal from SetNewDeptMgr (to raise the salary of the newly promoted dept mgr)

109 © Ellis Cohen Enforcement Procedure PROCEDURE SetNewDeptMgr( aDeptno int ) IS newmgr int; BEGIN FOR rec IN (SELECT empno FROM Emps WHERE deptno = aDeptno AND job = 'DEPTMGR') LOOP -- return if the dept has a DeptMgr RETURN; END LOOP; -- find longest hired employee in dept SELECT max(empno) INTO newmgr FROM Emps WHERE deptno = aDeptno AND hiredate = (SELECT min(hiredate) FROM Emps WHERE deptno = aDeptno); -- make that employee the new dept mgr UPDATE Emps SET job = 'DEPTMGR' WHERE empno = newmgr; -- don't forget to raise the salary of new dept mgrs RaiseSal( newmgr ); END; Cascading enforcement

110 © Ellis Cohen A Related Enforcement Example General Transition Constraint SetNewDeptMgrOnGain: Whenever an empty department gains new employees (but not a dept manager), then the employee in the department who has been with the company the longest becomes the new dept manager. Operations Affected AddEmp – hires a new employee ChangePosition – changes dept of an employee DestroyDept – destroys dept, possibly moving its employees to another dept

111 © Ellis Cohen Black Box Implementation AddEmp( :empno, :ename, :sal, :job, :mgr, :deptno ) BEGIN … base code to add the employee is here... but not shown SetNewDeptMgr( :deptno ); EXCEPTION WHEN OTHERS THEN doerr(); END; And similarly for ChangePosition & DestroyDept

112 © Ellis Cohen Specifying Output-Related Post Conditions

113 © Ellis Cohen Types of Post-Conditions State-Related Post-Conditions characterizes resulting changes to the database state -- e.g. the candidate's job entries must have all been deleted Output-Related Post-Conditions characterizes resulting properties of the operation output -- usually situations under which less information than expected was displayed External Post-Conditions characterizes resulting changes to the external environment -- e.g. a message was sent, etc.

114 © Ellis Cohen Output Post-Condition for Documentation SELECT empno, ename, sal FROM Emps WHERE empno = :curuser OR mgr = :curuser ShowSals + Output-Related Post-Condition (for Documentation): An employee can only see their own salary and the salaries of employees they manage

115 © Ellis Cohen Specifying Output-Related Post-Conditions Transition Constraints and State-Related Post-Conditions are described in terms of the state of tables We can use the same approach to describe Output-Related Post-Condition if we treat the OUTPUT as equivalent to one or more tables.

116 © Ellis Cohen Output-Related Post-Condition ShowAddrs( :ename ) OUTPUT Addresses( street, city, zip ) RESULTS IN EACH Addresses& a SATISFIES SOME Emps& e SATISFIES e.ename' = :ename AND e.street' = AND e.city' = AND e.zip' = AND e.isPublic' = 'T' An employee can only see another employee's address if it is public

117 © Ellis Cohen Using Attribute Matching SOME Emps&( ename': :ename, isPublic': 'T', street': city': zip': ) can be read as: There is some tuple in Emps& whose ename had the value :ename, etc. This allows us to write the constraint as ShowAddrs( :ename ) OUTPUT Addresses( street, city, zip ) RESULTS IN EACH Addresses& a SATISFIES SOME Emps&( ename': :ename, isPublic': 'T', street': city': zip': )

118 © Ellis Cohen Full Transition Assertions

119 © Ellis Cohen Limitations of Transition Assertions Transition assertions describes the required state after the action and the enforcement, but it is not easy to specify the details of the base action that actually caused that enforcement EACH Emps& e WHERE e.empno' IS NULL SATISFIES = 20 This specifies that every employee inserted is placed in dept 20. But there's no way to describe the exact circumstances that would cause that.

120 © Ellis Cohen Intermediate State To write more detailed transition assertions which specify when and how assertions are enforced, we need to be able to refer to the state after the base code of the operation is executed, but before the enforcement code executes base code enforcement code state before the action state after the action, including enforcement state before enforcement

121 © Ellis Cohen Fully Transitionalized Relations Emps Emps&& Refers to the state of the Emps table at a particular point in time Refers to the state of the Emps table at three distinct points in time 1.the time just before execution of an action 2.after base code execution, but before enforcement 3.after execution of the entire action Emps( empno, ename, job, sal ) Emps&& has a tuple for every tuple that was in Emps at any of these three points

122 © Ellis Cohen Fully Transitionalized Attributes For an employee e in Emps&& attr" – refers to the value of attr just before the action is executed attr' – refers to the value of attr after the base code is executed, but before the enforcement code is executed -- refers to the value of attr just after the action is fully executed, including enforcement

123 © Ellis Cohen Full Transition Assertions EACH Emps&& e WHERE e.empno" IS NULL AND e.deptno' = 10 SATISFIES = 20 If the base code of an action inserts an employee into dept 10, then at the end of the action, that employee is moved to dept 20. EACH Emps&& e WHERE e.empno" IS NULL AND e.empno' IS NOT NULL SATISFIES IS NULL Any employees inserted by the basic code of an action is deleted by the enforcement code. Transition Assertions based on fully transitionalized relations

124 © Ellis Cohen Specialized Deletion Integrity Constraint ANY ACTION RESULTS IN EACH Depts&& d WHERE d.deptno" IS NOT NULL AND d.deptno' IS NULL SATISFIES ( EACH Emps&& e WHERE e.deptno' = d.deptno" AND e.empno' IS NOT NULL SATISFIES = 66) When an operation deletes a department, all employees left in that department must be moved to dept 66 (the PARTY department!)

125 © Ellis Cohen Relational Lifetime Dependency Constraint ANY ACTION RESULTS IN EACH Depts&& d WHERE d.deptno" IS NOT NULL AND d.deptno' IS NULL SATISFIES ( EACH Emps&& e WHERE e.deptno' = d.deptno" SATISFIES IS NULL) When an operation deletes a department, all employees left in that department are deleted

126 © Ellis Cohen Relational Deassignment Constraint ANY ACTION RESULTS IN EACH Depts&& d WHERE d.deptno" IS NOT NULL AND d.deptno' IS NULL SATISFIES ( EACH Emps&& e WHERE e.deptno' = d.deptno" SATISFIES IS NULL AND IS NOT NULL) When an operation deletes a department, all employees left in that department become unassigned