Active DatabasesCIS 6711 Triggers: The Problem - Examples from COMPANY Database 1.Limit all salary...

25
Active Databases CIS 671 1 Triggers: The Problem - Examples from COMPANY Database 1.Limit all salary increases to 50%. 2.Enforce policy that salaries may never decrease. 3.Maintain TotalSalary in DEPARTMENT relation as employees and their salaries change. 4.Inform a supervisor whenever a supervisee’s salary becomes larger than the supervisor’s. 5.All new hires for a given job code get the same starting salary, which is available in the STARTING_PAY table. EMPLOYEE(Name, SSN , Salary, DNO, SupervisorSSN, JobCode) DEPARTMENT(DNO , TotalSalary, ManagerSSN) STARTING_PAY(JobCode , StartPay)

Transcript of Active DatabasesCIS 6711 Triggers: The Problem - Examples from COMPANY Database 1.Limit all salary...

Page 1: Active DatabasesCIS 6711 Triggers: The Problem - Examples from COMPANY Database 1.Limit all salary increases to 50%. 2.Enforce policy that salaries may.

Active Databases CIS 671 1

Triggers: The Problem -Examples from COMPANY Database

1. Limit all salary increases to 50%. 2. Enforce policy that salaries may never decrease.

3. Maintain TotalSalary in DEPARTMENT relation as employees and their salaries change.

4. Inform a supervisor whenever a supervisee’s salary becomes larger than the supervisor’s.

5. All new hires for a given job code get the same starting salary, which is available in the STARTING_PAY table.

EMPLOYEE(Name, SSN, Salary, DNO, SupervisorSSN, JobCode)DEPARTMENT(DNO, TotalSalary, ManagerSSN) STARTING_PAY(JobCode, StartPay)

Page 2: Active DatabasesCIS 6711 Triggers: The Problem - Examples from COMPANY Database 1.Limit all salary increases to 50%. 2.Enforce policy that salaries may.

Active Databases CIS 671 2

The Problem:Example from BANK Database

Branch(BranchID, BranchName, BranchCity, Assets)Customer(CustID, CustName, CustStreet, CustCity)

Account(AccountNo, BranchID, Balance)AccountCustomer(AccountNo, CustID)

Loan(LoanNo, BranchID, Balance)LoanCustomer(LoanID, CustID)

6. Branch Assets are maintained as sum(Account.Balance) for each branch.

7. Overdrafts do not produce a negative balance. Instead they are treated as a loan. The account balance is set to 0 and a loan is created for the amount of the overdraft.

Page 3: Active DatabasesCIS 6711 Triggers: The Problem - Examples from COMPANY Database 1.Limit all salary increases to 50%. 2.Enforce policy that salaries may.

Active Databases CIS 671 3

The Problem:Example from TEMPERATURE Database

TEMPS City Temp

Denver 25

Columbus 15

Anchorage

-15

EXTREMES City HighTemp

HighDate

LowTemp

LowDate

Denver 100 7/30 -10 1/20

Columbus 95 7/5 2 2/14

Anchorage

87 8/3 -10 2/16

8. Given table of temperatures TEMPS, that is periodically updated, keep the table of extreme temperatures EXTREMES up to date.

Create the EXTREMES table and populate with all the cities in the TEMPS table, setting the other attributes to null.

Page 4: Active DatabasesCIS 6711 Triggers: The Problem - Examples from COMPANY Database 1.Limit all salary increases to 50%. 2.Enforce policy that salaries may.

Active Databases CIS 671 4

What is Needed?The Event-Condition-Action Model

(ECA Model)

• Rules (or triggers) with three components:– Event triggering the rule. (insert, delete, update)

• E.g., an employee’s salary changes.

– Condition to determine if rule action should be executed.

• E.g., is new Temp in City higher than HighTemp for that City?

– Action to be taken.• E.g., update the Department’s Total Salary.

Page 5: Active DatabasesCIS 6711 Triggers: The Problem - Examples from COMPANY Database 1.Limit all salary increases to 50%. 2.Enforce policy that salaries may.

Active Databases CIS 671 5

What is Needed?The Event-Condition-Action Model

(ECA Model), continued

• Actions may apply before or after the triggering event is executed.

• An SQL statement may change several rows.– Apply action once per SQL statement.– Apply action for each row changed by SQL

statement.

Page 6: Active DatabasesCIS 6711 Triggers: The Problem - Examples from COMPANY Database 1.Limit all salary increases to 50%. 2.Enforce policy that salaries may.

Active Databases CIS 671 6

Availability

• Triggers included in SQL 1999 (SQL 3) – Not in earlier standards.

• Included much earlier in most products:– Oracle, Sybase, DB2– As a consequence syntax may differ from the

standard.

Page 7: Active DatabasesCIS 6711 Triggers: The Problem - Examples from COMPANY Database 1.Limit all salary increases to 50%. 2.Enforce policy that salaries may.

Active Databases CIS 671 7

The Problem:Examples from COMPANY Database

1. Limit all salary increases to 50%.2. Enforce policy that salaries may never decrease.3. Maintain TotalSalary in DEPARTMENT relation as

employees and their salaries change. (EN, Fig. 23.2 (a))4. Inform a supervisor whenever a supervisee’s salary

becomes larger than the supervisor’s. (EN, Fig. 23.2 (b))5. All new hires for a given job code get the same starting

salary, which is available in the STARTING_PAY table.

EMPLOYEE(Name, SSN, Salary, DNO, SupervisorSSN, JobCode)DEPARTMENT(DNO, TotalSalary, ManagerSSN) STARTING_PAY(JobCode, StartPay)

Page 8: Active DatabasesCIS 6711 Triggers: The Problem - Examples from COMPANY Database 1.Limit all salary increases to 50%. 2.Enforce policy that salaries may.

Active Databases CIS 671 8

1. COMPANY DatabaseLimit all salary increases to 50%

before trigger emp_salary_limit

create trigger emp_salary_limitbefore update of EMPLOYEEfor each row

when (new.Salary > 1.5 * old.Salary)set new.Salary = 1.5 * old.Salary;

EMPLOYEE(Name, SSN, Salary, DNO, SupervisorSSN, JobCode)

“new” refers to the new tuple.

“old” refers to the old tuple.

Page 9: Active DatabasesCIS 6711 Triggers: The Problem - Examples from COMPANY Database 1.Limit all salary increases to 50%. 2.Enforce policy that salaries may.

Active Databases CIS 671 9

2. COMPANY Database Enforce policy that salaries may never decrease

before trigger emp_salary_no_decrease

create trigger emp_salary_no_decreasebefore update of EMPLOYEEfor each row

when (new.Salary < old.Salary)begin

log the event;signal error condition;

end

Method depends on DBMS.

EMPLOYEE(Name, SSN, Salary, DNO, SupervisorSSN, JobCode)

Page 10: Active DatabasesCIS 6711 Triggers: The Problem - Examples from COMPANY Database 1.Limit all salary increases to 50%. 2.Enforce policy that salaries may.

Active Databases CIS 671 10

5. COMPANY Database: All new hires for a given job code get the same starting salary, which is available in the STARTING_PAY table.

before trigger emp_start_pay

create trigger emp_start_paybefore insert on EMPLOYEEfor each row

set Salary =(select StartPayfrom STARTING_PAYwhere JobCode = new.JobCode)

EMPLOYEE(Name, SSN, Salary, DNO, SupervisorSSN, JobCode)STARTING_PAY(JobCode, StartPay)

Page 11: Active DatabasesCIS 6711 Triggers: The Problem - Examples from COMPANY Database 1.Limit all salary increases to 50%. 2.Enforce policy that salaries may.

Active Databases CIS 671 11

7. BANK Database: Overdrafts do not produce a negative balance. Instead they are treated as a loan. The account balance is set to 0 and a loan is created for the amount of the overdraft.

after trigger overdraft_trigger

Page 12: Active DatabasesCIS 6711 Triggers: The Problem - Examples from COMPANY Database 1.Limit all salary increases to 50%. 2.Enforce policy that salaries may.

Active Databases CIS 671 12

7. BANK Database: Overdrafts, continued after trigger overdraft_trigger

Branch(BranchID, BranchName, BranchCity, Assets)Customer(CustID, CustName, CustStreet, CustCity)

Account(AccountNo, BranchID, Balance)AccountCustomer(AccountNo, CustID)

Loan(LoanNo, BranchID, Balance)LoanCustomer(LoanID, CustID)

• Insert a new tuple in the Loan relation, using same branch as the account. Make LoanNo the same as the AccountNo and the Balance the amount of the overdraft.

• Insert a new tuple in the LoanCustomer relation relating the new loan to this customer.

• Set the Balance of the Account tuple to 0.

Page 13: Active DatabasesCIS 6711 Triggers: The Problem - Examples from COMPANY Database 1.Limit all salary increases to 50%. 2.Enforce policy that salaries may.

Active Databases CIS 671 13

7. BANK Database: Overdrafts, continued after trigger overdraft_trigger

create trigger overdraft_trigger after update on Accountfor each rowwhen new.balance < 0begin

insert into Loan values(new.AccountID, new.BranchID, -new.Balance);

insert into LoanCustomer(select CustID, AccountNofrom AccountCustomer ACwhere new.AccountID = AC.AccountID);

update Accountset Balance = 0where Account.AccountNo = new.AccountNo;

end;

Page 14: Active DatabasesCIS 6711 Triggers: The Problem - Examples from COMPANY Database 1.Limit all salary increases to 50%. 2.Enforce policy that salaries may.

Active Databases CIS 671 14

8. TEMPS Database: Create the EXTREMES table and populate with all the cities in the TEMPS table, setting the other attributes to null.

after triggers HighTempUpdate and LowTempUpdate

TEMPS(City, Temp)EXTREMES(City, HighTemp, HighDate, LowTemp, LowDate)

• Need two after triggers– one for updating the high temperature (HighTempUpdate), – the other for updating the low temperature (LowTempUpdate).

• They will be very similar.

Page 15: Active DatabasesCIS 6711 Triggers: The Problem - Examples from COMPANY Database 1.Limit all salary increases to 50%. 2.Enforce policy that salaries may.

Active Databases CIS 671 15

8. TEMPS Database: continued. High Tempearture Update

create trigger HighTempUpdateafter update of TEMPSfor each row

when (new.Temp >( select HighTempfrom EXTREMESwhere City= new.City)

or (select HighTemp from EXTREMES

where City = new.City) is null ))update EXTREMES

set HighTemp = new.Temp,HighDate = current date

where City = new.City;

TEMPS(City, Temp)EXTREMES(City, HighTemp, HighDate, LowTemp, LowDate)

Initially HighTemp

is null.

Normal situation.

Low Temperature similar.

Page 16: Active DatabasesCIS 6711 Triggers: The Problem - Examples from COMPANY Database 1.Limit all salary increases to 50%. 2.Enforce policy that salaries may.

Active Databases CIS 671 16

8. TEMPS Database: continued. Other Problems

• Insert a new City into TEMPS.– Must also insert into EXTREMES.– Initial values of HighTemp, HighDate, LowTemp, LowDate must be set.

• Delete a City from TEMPS.– Leave City in EXTREMES.– Delete City from EXTREMES.

Page 17: Active DatabasesCIS 6711 Triggers: The Problem - Examples from COMPANY Database 1.Limit all salary increases to 50%. 2.Enforce policy that salaries may.

Active Databases CIS 671 17

8. TEMPS Database: continued.Insert a new City into TEMPS:

Insert City tuple into EXTREMES.Set initial values of HighTemp, HighDate,

LowTemp, LowDate.

create trigger NewCityafter insert of TEMPSfor each row

insert into EXTREMES(City,HighTemp, HighDate,LowTemp, LowDate)

values(new.City, new.Temp, Current Date, new.Temp, Current Date);

TEMPS(City, Temp)EXTREMES(City, HighTemp, HighDate, LowTemp, LowDate)

Page 18: Active DatabasesCIS 6711 Triggers: The Problem - Examples from COMPANY Database 1.Limit all salary increases to 50%. 2.Enforce policy that salaries may.

Active Databases CIS 671 18

8. TEMPS Database: continued.Delete a City from TEMPS:

Delete City tuple from EXTREMES.Add Foreign Key constraint for EXTREMES.

Alter table EXTREMESadd constraint fk

foreign key(City) references TEMPSon delete cascade;

TEMPS(City, Temp)EXTREMES(City, HighTemp, HighDate, LowTemp, LowDate)

Page 19: Active DatabasesCIS 6711 Triggers: The Problem - Examples from COMPANY Database 1.Limit all salary increases to 50%. 2.Enforce policy that salaries may.

Active Databases CIS 671 19

Problems with Use of Triggers

• How to guarantee set of triggers is consistent?• Recursion is allowed.

– How to guarantee termination?

• Tools are still needed to help address these problems.

Page 20: Active DatabasesCIS 6711 Triggers: The Problem - Examples from COMPANY Database 1.Limit all salary increases to 50%. 2.Enforce policy that salaries may.

Active Databases CIS 671 20

Triggers: The Problem -9. Another Example from

COMPANY Database

1. Add a new field, Span, to the EMPLOYEE relation. • For each employee, Span is the number of employees supervised.

2. Initialize Span appropriately.3. Keep Span correct as the database changes.

EMPLOYEE(Name, SSN, Salary, DNO, SupervisorSSN, JobCode)DEPARTMENT(DNO, TotalSalary, ManagerSSN) STARTING_PAY(JobCode, StartPay)

EMPLOYEE(Name, SSN, Salary, DNO, SupervisorSSN, JobCode, Span)

Page 21: Active DatabasesCIS 6711 Triggers: The Problem - Examples from COMPANY Database 1.Limit all salary increases to 50%. 2.Enforce policy that salaries may.

Active Databases CIS 671 21

9. COMPANY Database

For each employee, Span is the number of employees supervised.

Idea

• Add the Span attribute to EMPLOYEE.

• Initialize the values of Span based on the current database.

• Create insert, delete and update triggers to keep Span up to date for an employee’s immediate supervisor.

• Create another update trigger to propagate the change in Span up through the rest of the hierarchy.

EMPLOYEE(Name, SSN, Salary, DNO, SupervisorSSN, JobCode, Span)

Page 22: Active DatabasesCIS 6711 Triggers: The Problem - Examples from COMPANY Database 1.Limit all salary increases to 50%. 2.Enforce policy that salaries may.

Active Databases CIS 671 22

9. COMPANY DatabaseUpdate Span for the immediate supervisor.

create trigger EmpHire after insert on EMPLOYEE

for each rowupdate EMPLOYEE

set Span = Span + 1where SSN =

new.SupervisorSSN;

EMPLOYEE(Name, SSN, ..., SupervisorSSN,..., Span)

create trigger EmpTransfer after update of SupervisorSSN

on EMPLOYEEfor each row

beginupdate EMPLOYEE

set Span = Span - 1where SSN =

old.SupervisorSSN;update EMPLOYEE

set Span = Span + 1where SSN =

new.SupervisorSSN;end;

create trigger EmpQuit after delete on EMPLOYEE

for each rowupdate EMPLOYEE

set Span = Span - 1where SSN =

old.SupervisorSSN;

Page 23: Active DatabasesCIS 6711 Triggers: The Problem - Examples from COMPANY Database 1.Limit all salary increases to 50%. 2.Enforce policy that salaries may.

Active Databases CIS 671 23

9. COMPANY DatabasePropagate Span up the supervisor tree.

EMPLOYEE(Name, SSN, Salary, DNO, SupervisorSSN, JobCode, Span)A 123 456 4B 456 789 8

create trigger EmpPropagate after update of Span on

EMPLOYEEfor each row

update EMPLOYEEset Span = Span +

(new.Span - old.Span) where SSN =

new.SupervisorSSN;

Supervisor

+(new.Span - old.Span)decrease (4 - 5) = -1increase (4 - 3) = +1

new value

Page 24: Active DatabasesCIS 6711 Triggers: The Problem - Examples from COMPANY Database 1.Limit all salary increases to 50%. 2.Enforce policy that salaries may.

Active Databases CIS 671 24

10. For each PERSON, record their mother, father and number of descendants.

PERSONS(Name, Mother, Father, NumDescendants)

create trigger NewMother after insert on PERSONS

for each rowupdate PERSONS

set NumDescendants = NumDescendants + 1

where Name = new.Mother;

create trigger NewFather after insert on PERSONS

for each rowupdate PERSONS

set NumDescendants = NumDescendants + 1

where Name = new.Father;

Then update the maternal and paternal ancestors.

After insert, update the mother and father.

Page 25: Active DatabasesCIS 6711 Triggers: The Problem - Examples from COMPANY Database 1.Limit all salary increases to 50%. 2.Enforce policy that salaries may.

Active Databases CIS 671 25

10. For each PERSON, record their mother, father and number of descendants.

Update the maternal and paternal ancestors.

create trigger MaternalAncestor after update of NumDescendants on PERSONS

for each rowupdate PERSONS

set NumDescendants = NumDescendants + new.NumDescendants- old.NumDescendants

where Name = new.Mother;

At nth level of family tree, how many triggers?

PERSONS(Name, Mother, Father, NumDescendants)

create trigger PaternalAncestor after update of NumDescendants on PERSONS

/* Similar. Just replace “Mother” with “Father.” */