Presentation is loading. Please wait.

Presentation is loading. Please wait.

CPSC-310 Database Systems

Similar presentations


Presentation on theme: "CPSC-310 Database Systems"— Presentation transcript:

1 CPSC-310 Database Systems
Professor Jianer Chen Room 315C HRBB Lecture #16

2 Our Running Example Our SQL queries will be based on the following database schema (Underline indicates key attributes) Beers(name, manf) Bars(name, addr, license) Drinkers(name, addr, phone) Likes(drinker, beer) Sells(bar, beer, price) Frequents(drinker, bar)

3 Constraints and Triggers
A constraint is a relationship among data elements that the DBMS is required to enforce. -- e.g., key constraints. A trigger is an action only executed when a specified condition occurs, e.g., insertion of a tuple. -- easier to implement than complex constraints.

4 Constraints and Triggers
A constraint is a relationship among data elements that the DBMS is required to enforce. -- e.g., key constraints. A trigger is an action only executed when a specified condition occurs, e.g., insertion of a tuple. -- easier to implement than complex constraints.

5 Triggers: Motivation

6 Triggers: Motivation

7 Triggers: Motivation Assertions are powerful, but the DBMS often can’t tell when they need to be checked.

8 Triggers: Motivation Assertions are powerful, but the DBMS often can’t tell when they need to be checked. Attribute- and tuple-based checks are checked at known times, but are not powerful.

9 Triggers: Motivation Assertions are powerful, but the DBMS often can’t tell when they need to be checked. Attribute- and tuple-based checks are checked at known times, but are not powerful. Triggers let the user decide when to check for a powerful condition.

10 Event-Condition-Action Rules
Another name for trigger is ECA rule, or event-condition-action rule.

11 Event-Condition-Action Rules
Another name for trigger is ECA rule, or event-condition-action rule. Event: typically a type of database modification, e.g., “insert on Sells.”

12 Event-Condition-Action Rules
Another name for trigger is ECA rule, or event-condition-action rule. Event: typically a type of database modification, e.g., “insert on Sells.” Condition: Any SQL boolean-valued expression.

13 Event-Condition-Action Rules
Another name for trigger is ECA rule, or event-condition-action rule. Event: typically a type of database modification, e.g., “insert on Sells.” Condition: Any SQL boolean-valued expression. Action: Any SQL statements.

14 Beers(name, manf) Sells(bar, beer, price) Example: A Trigger Instead of using a foreign-key constraint and rejecting insertions into Sells(bar, beer, price) with unknown beers, a trigger can add that beer to Beers, with a NULL manufacturer.

15 Beers(name, manf) Sells(bar, beer, price) Example: A Trigger Instead of using a foreign-key constraint and rejecting insertions into Sells(bar, beer, price) with unknown beers, a trigger can add that beer to Beers, with a NULL manufacturer. CREATE TRIGGER BeerTrig AFTER INSERT ON Sells REFERENCING NEW ROW AS NewTuple FOR EACH ROW WHEN (NewTuple.beer NOT IN (SELECT name FROM Beers)) INSERT INTO Beers(name) VALUES(NewTuple.beer);

16 Beers(name, manf) Sells(bar, beer, price) Example: A Trigger Instead of using a foreign-key constraint and rejecting insertions into Sells(bar, beer, price) with unknown beers, a trigger can add that beer to Beers, with a NULL manufacturer. the event CREATE TRIGGER BeerTrig AFTER INSERT ON Sells REFERENCING NEW ROW AS NewTuple FOR EACH ROW WHEN (NewTuple.beer NOT IN (SELECT name FROM Beers)) INSERT INTO Beers(name) VALUES(NewTuple.beer);

17 Beers(name, manf) Sells(bar, beer, price) Example: A Trigger Instead of using a foreign-key constraint and rejecting insertions into Sells(bar, beer, price) with unknown beers, a trigger can add that beer to Beers, with a NULL manufacturer. the event CREATE TRIGGER BeerTrig AFTER INSERT ON Sells REFERENCING NEW ROW AS NewTuple FOR EACH ROW WHEN (NewTuple.beer NOT IN (SELECT name FROM Beers)) INSERT INTO Beers(name) VALUES(NewTuple.beer); the condition

18 Beers(name, manf) Sells(bar, beer, price) Example: A Trigger Instead of using a foreign-key constraint and rejecting insertions into Sells(bar, beer, price) with unknown beers, a trigger can add that beer to Beers, with a NULL manufacturer. the event CREATE TRIGGER BeerTrig AFTER INSERT ON Sells REFERENCING NEW ROW AS NewTuple FOR EACH ROW WHEN (NewTuple.beer NOT IN (SELECT name FROM Beers)) INSERT INTO Beers(name) VALUES(NewTuple.beer); the condition the action

19 Trigger: CREATE TRIGGER
CREATE TRIGGER <name>

20 Trigger: CREATE TRIGGER
CREATE TRIGGER <name> Option: CREATE OR REPLACE TRIGGER <name>

21 Trigger: CREATE TRIGGER
CREATE TRIGGER <name> Option: CREATE OR REPLACE TRIGGER <name> -- Useful if there is a trigger with that name and you want to modify the trigger.

22 Trigger: The Event

23 Trigger: The Event CREATE TRIGGER BeerTrig AFTER INSERT ON Sells
REFERENCING NEW ROW AS NewTuple FOR EACH ROW WHEN (NewTuple.beer NOT IN (SELECT name FROM Beers)) INSERT INTO Beers(name) VALUES(NewTuple.beer); Trigger: The Event

24 Trigger: The Event AFTER can be BEFORE. CREATE TRIGGER BeerTrig
AFTER INSERT ON Sells REFERENCING NEW ROW AS NewTuple FOR EACH ROW WHEN (NewTuple.beer NOT IN (SELECT name FROM Beers)) INSERT INTO Beers(name) VALUES(NewTuple.beer); Trigger: The Event AFTER can be BEFORE.

25 Trigger: The Event AFTER can be BEFORE.
CREATE TRIGGER BeerTrig AFTER INSERT ON Sells REFERENCING NEW ROW AS NewTuple FOR EACH ROW WHEN (NewTuple.beer NOT IN (SELECT name FROM Beers)) INSERT INTO Beers(name) VALUES(NewTuple.beer); Trigger: The Event AFTER can be BEFORE. -- also, can be INSTEAD OF if the relation is a view (to be discussed later).

26 Trigger: The Event AFTER can be BEFORE.
CREATE TRIGGER BeerTrig AFTER INSERT ON Sells REFERENCING NEW ROW AS NewTuple FOR EACH ROW WHEN (NewTuple.beer NOT IN (SELECT name FROM Beers)) INSERT INTO Beers(name) VALUES(NewTuple.beer); Trigger: The Event AFTER can be BEFORE. -- also, can be INSTEAD OF if the relation is a view (to be discussed later). INSERT can be DELETE or UPDATE.

27 Trigger: The Event AFTER can be BEFORE.
CREATE TRIGGER BeerTrig AFTER INSERT ON Sells REFERENCING NEW ROW AS NewTuple FOR EACH ROW WHEN (NewTuple.beer NOT IN (SELECT name FROM Beers)) INSERT INTO Beers(name) VALUES(NewTuple.beer); Trigger: The Event AFTER can be BEFORE. -- also, can be INSTEAD OF if the relation is a view (to be discussed later). INSERT can be DELETE or UPDATE. -- UPDATE ON <relation> can be UPDATE OF <attribute> ON <relation> for a particular <attribute> of the <relation>.

28 Trigger: Row-Level and Statement-Level
CREATE TRIGGER BeerTrig AFTER INSERT ON Sells REFERENCING NEW ROW AS NewTuple FOR EACH ROW WHEN (NewTuple.beer NOT IN (SELECT name FROM Beers)) INSERT INTO Beers(name) VALUES(NewTuple.beer); Trigger: Row-Level and Statement-Level

29 Trigger: Row-Level and Statement-Level
CREATE TRIGGER BeerTrig AFTER INSERT ON Sells REFERENCING NEW ROW AS NewTuple FOR EACH ROW WHEN (NewTuple.beer NOT IN (SELECT name FROM Beers)) INSERT INTO Beers(name) VALUES(NewTuple.beer); Trigger: Row-Level and Statement-Level Triggers are either “row-level” or “statement- level.”

30 Trigger: Row-Level and Statement-Level
CREATE TRIGGER BeerTrig AFTER INSERT ON Sells REFERENCING NEW ROW AS NewTuple FOR EACH ROW WHEN (NewTuple.beer NOT IN (SELECT name FROM Beers)) INSERT INTO Beers(name) VALUES(NewTuple.beer); Trigger: Row-Level and Statement-Level Triggers are either “row-level” or “statement- level.” FOR EACH ROW indicates row-level; its absence indicates statement-level (can also be FOR EACH STATEMENT).

31 Trigger: Row-Level and Statement-Level
CREATE TRIGGER BeerTrig AFTER INSERT ON Sells REFERENCING NEW ROW AS NewTuple FOR EACH ROW WHEN (NewTuple.beer NOT IN (SELECT name FROM Beers)) INSERT INTO Beers(name) VALUES(NewTuple.beer); Trigger: Row-Level and Statement-Level Triggers are either “row-level” or “statement- level.” FOR EACH ROW indicates row-level; its absence indicates statement-level (can also be FOR EACH STATEMENT). Row-level triggers: execute once for each modified tuple.

32 Trigger: Row-Level and Statement-Level
CREATE TRIGGER BeerTrig AFTER INSERT ON Sells REFERENCING NEW ROW AS NewTuple FOR EACH ROW WHEN (NewTuple.beer NOT IN (SELECT name FROM Beers)) INSERT INTO Beers(name) VALUES(NewTuple.beer); Trigger: Row-Level and Statement-Level Triggers are either “row-level” or “statement- level.” FOR EACH ROW indicates row-level; its absence indicates statement-level (can also be FOR EACH STATEMENT). Row-level triggers: execute once for each modified tuple. Statement-level triggers: execute once for an SQL statement (many tuples can be modified)

33 Trigger: REFERENCING CREATE TRIGGER BeerTrig AFTER INSERT ON Sells
REFERENCING NEW ROW AS NewTuple FOR EACH ROW WHEN (NewTuple.beer NOT IN (SELECT name FROM Beers)) INSERT INTO Beers(name) VALUES(NewTuple.beer); Trigger: REFERENCING

34 CREATE TRIGGER BeerTrig
AFTER INSERT ON Sells REFERENCING NEW ROW AS NewTuple FOR EACH ROW WHEN (NewTuple.beer NOT IN (SELECT name FROM Beers)) INSERT INTO Beers(name) VALUES(NewTuple.beer); Trigger: REFERENCING INSERT implies a new row (tuple) (for row- level) or a new table (for statement-level).

35 CREATE TRIGGER BeerTrig
AFTER INSERT ON Sells REFERENCING NEW ROW AS NewTuple FOR EACH ROW WHEN (NewTuple.beer NOT IN (SELECT name FROM Beers)) INSERT INTO Beers(name) VALUES(NewTuple.beer); Trigger: REFERENCING INSERT implies a new row (tuple) (for row- level) or a new table (for statement-level). DELETE implies an old tuple or table.

36 CREATE TRIGGER BeerTrig
AFTER INSERT ON Sells REFERENCING NEW ROW AS NewTuple FOR EACH ROW WHEN (NewTuple.beer NOT IN (SELECT name FROM Beers)) INSERT INTO Beers(name) VALUES(NewTuple.beer); Trigger: REFERENCING INSERT implies a new row (tuple) (for row- level) or a new table (for statement-level). DELETE implies an old tuple or table. UPDATE implies both.

37 CREATE TRIGGER BeerTrig
AFTER INSERT ON Sells REFERENCING NEW ROW AS NewTuple FOR EACH ROW WHEN (NewTuple.beer NOT IN (SELECT name FROM Beers)) INSERT INTO Beers(name) VALUES(NewTuple.beer); Trigger: REFERENCING INSERT implies a new row (tuple) (for row- level) or a new table (for statement-level). DELETE implies an old tuple or table. UPDATE implies both. Refer to these by REFERENCING [NEW OLD] [ROW TABLE] AS <name>

38 CREATE TRIGGER BeerTrig
AFTER INSERT ON Sells REFERENCING NEW ROW AS NewTuple FOR EACH ROW WHEN (NewTuple.beer NOT IN (SELECT name FROM Beers)) INSERT INTO Beers(name) VALUES(NewTuple.beer); Trigger: REFERENCING INSERT implies a new row (tuple) (for row- level) or a new table (for statement-level). DELETE implies an old tuple or table. UPDATE implies both. Refer to these by REFERENCING [NEW OLD] [ROW TABLE] AS <name> For statement-level trigger, the <name> above is used as a relation (table)

39 Trigger: The Condition
CREATE TRIGGER BeerTrig AFTER INSERT ON Sells REFERENCING NEW ROW AS NewTuple FOR EACH ROW WHEN (NewTuple.beer NOT IN (SELECT name FROM Beers)) INSERT INTO Beers(name) VALUES(NewTuple.beer); Trigger: The Condition

40 Trigger: The Condition
CREATE TRIGGER BeerTrig AFTER INSERT ON Sells REFERENCING NEW ROW AS NewTuple FOR EACH ROW WHEN (NewTuple.beer NOT IN (SELECT name FROM Beers)) INSERT INTO Beers(name) VALUES(NewTuple.beer); Trigger: The Condition Any boolean-valued condition is appropriate.

41 Trigger: The Condition
CREATE TRIGGER BeerTrig AFTER INSERT ON Sells REFERENCING NEW ROW AS NewTuple FOR EACH ROW WHEN (NewTuple.beer NOT IN (SELECT name FROM Beers)) INSERT INTO Beers(name) VALUES(NewTuple.beer); Trigger: The Condition Any boolean-valued condition is appropriate. It is evaluated before or after the triggering event, depending on whether BEFORE or AFTER is used in the event.

42 Trigger: The Condition
CREATE TRIGGER BeerTrig AFTER INSERT ON Sells REFERENCING NEW ROW AS NewTuple FOR EACH ROW WHEN (NewTuple.beer NOT IN (SELECT name FROM Beers)) INSERT INTO Beers(name) VALUES(NewTuple.beer); Trigger: The Condition Any boolean-valued condition is appropriate. It is evaluated before or after the triggering event, depending on whether BEFORE or AFTER is used in the event. Access the new/old tuple or set of tuples (i.e., the table) through the names declared in the REFERENCING clause.

43 Trigger: The Action CREATE TRIGGER BeerTrig AFTER INSERT ON Sells
REFERENCING NEW ROW AS NewTuple FOR EACH ROW WHEN (NewTuple.beer NOT IN (SELECT name FROM Beers)) INSERT INTO Beers(name) VALUES(NewTuple.beer); Trigger: The Action

44 CREATE TRIGGER BeerTrig
AFTER INSERT ON Sells REFERENCING NEW ROW AS NewTuple FOR EACH ROW WHEN (NewTuple.beer NOT IN (SELECT name FROM Beers)) INSERT INTO Beers(name) VALUES(NewTuple.beer); Trigger: The Action There can be more than one SQL statement in the action (surround by BEGIN END if there are more than one statements).

45 CREATE TRIGGER BeerTrig
AFTER INSERT ON Sells REFERENCING NEW ROW AS NewTuple FOR EACH ROW WHEN (NewTuple.beer NOT IN (SELECT name FROM Beers)) INSERT INTO Beers(name) VALUES(NewTuple.beer); Trigger: The Action There can be more than one SQL statement in the action (surround by BEGIN END if there are more than one statements). But queries make no sense in an action, so we are really limited to modifications.

46 Another Example Using Sells(bar, beer, price) and a unary relation RipoffBars(bar) created for the purpose, maintain a list of bars that raise the price of any beer by more than $1.

47 Another Example Using Sells(bar, beer, price) and a unary relation RipoffBars(bar) created for the purpose, maintain a list of bars that raise the price of any beer by more than $1. CREATE TRIGGER PriceTrig AFTER UPDATE OF price ON Sells REFERENCING OLD ROW AS ooo NEW ROW AS nnn FOR EACH ROW WHEN (nnn.price > ooo.price ) INSERT INTO RipoffBars VALUES (nnn.bar);

48 Another Example Using Sells(bar, beer, price) and a unary relation RipoffBars(bar) created for the purpose, maintain a list of bars that raise the price of any beer by more than $1. event: only when price is changed CREATE TRIGGER PriceTrig AFTER UPDATE OF price ON Sells REFERENCING OLD ROW AS ooo NEW ROW AS nnn FOR EACH ROW WHEN (nnn.price > ooo.price ) INSERT INTO RipoffBars VALUES (nnn.bar);

49 Another Example Using Sells(bar, beer, price) and a unary relation RipoffBars(bar) created for the purpose, maintain a list of bars that raise the price of any beer by more than $1. event: only when price is changed CREATE TRIGGER PriceTrig AFTER UPDATE OF price ON Sells REFERENCING OLD ROW AS ooo NEW ROW AS nnn FOR EACH ROW WHEN (nnn.price > ooo.price ) INSERT INTO RipoffBars VALUES (nnn.bar); UPDATE lets us to talk about new and old tuples (rows).

50 Another Example Using Sells(bar, beer, price) and a unary relation RipoffBars(bar) created for the purpose, maintain a list of bars that raise the price of any beer by more than $1. event: only when price is changed CREATE TRIGGER PriceTrig AFTER UPDATE OF price ON Sells REFERENCING OLD ROW AS ooo NEW ROW AS nnn FOR EACH ROW WHEN (nnn.price > ooo.price ) INSERT INTO RipoffBars VALUES (nnn.bar); UPDATE lets us to talk about new and old tuples (rows). row-level trigger: process whenever price for a tuple in Sells is updated

51 Another Example Using Sells(bar, beer, price) and a unary relation RipoffBars(bar) created for the purpose, maintain a list of bars that raise the price of any beer by more than $1. event: only when price is changed CREATE TRIGGER PriceTrig AFTER UPDATE OF price ON Sells REFERENCING OLD ROW AS ooo NEW ROW AS nnn FOR EACH ROW WHEN (nnn.price > ooo.price ) INSERT INTO RipoffBars VALUES (nnn.bar); UPDATE lets us to talk about new and old tuples (rows). row-level trigger: process whenever price for a tuple in Sells is updated condition: price is raised by > $1

52 Another Example Using Sells(bar, beer, price) and a unary relation RipoffBars(bar) created for the purpose, maintain a list of bars that raise the price of any beer by more than $1. event: only when price is changed CREATE TRIGGER PriceTrig AFTER UPDATE OF price ON Sells REFERENCING OLD ROW AS ooo NEW ROW AS nnn FOR EACH ROW WHEN (nnn.price > ooo.price ) INSERT INTO RipoffBars VALUES (nnn.bar); UPDATE lets us to talk about new and old tuples (rows). row-level trigger: process whenever price for a tuple in Sells is updated condition: price is raised by > $1 action: record the bar in RipoffBars.

53 Triggers on Views

54 Triggers on Views A view is a “virtual table” = a relation defined in terms of other tables and views.

55 Triggers on Views A view is a “virtual table” = a relation defined in terms of other tables and views. Declare by: CREATE VIEW <name> AS <subquery>;

56 Triggers on Views A view is a “virtual table” = a relation defined in terms of other tables and views. Declare by: CREATE VIEW <name> AS <subquery>; Example: CanDrink(drinker, beer) is a view made from relations Sells(bar, beer, price) and Frequents(drinker, bar) that “contains” the drinker-beer pairs such that the drinker frequents at least one bar that serves the beer:

57 Triggers on Views A view is a “virtual table” = a relation defined in terms of other tables and views. Declare by: CREATE VIEW <name> AS <subquery>; Example: CanDrink(drinker, beer) is a view made from relations Sells(bar, beer, price) and Frequents(drinker, bar) that “contains” the drinker-beer pairs such that the drinker frequents at least one bar that serves the beer: CREATE VIEW CanDrink AS SELECT drinker, beer FROM Frequents, Sells WHERE Frequents.bar = Sells.bar;

58 Triggers on Views Sells(bar, beer, price) Likes(drinker, beer)
Frequents(drinker, bar) Triggers on Views

59 Sells(bar, beer, price) Likes(drinker, beer) Frequents(drinker, bar) Triggers on Views In general, it is impossible to modify a view, because it doesn’t exist.

60 Sells(bar, beer, price) Likes(drinker, beer) Frequents(drinker, bar) Triggers on Views In general, it is impossible to modify a view, because it doesn’t exist. But an INSTEAD OF trigger let us interpret view modifications in a way that makes sense.

61 Sells(bar, beer, price) Likes(drinker, beer) Frequents(drinker, bar) Triggers on Views In general, it is impossible to modify a view, because it doesn’t exist. But an INSTEAD OF trigger let us interpret view modifications in a way that makes sense. Example: we design a view Synergy with tuples (drinker, beer, bar) such that the bar serves the beer, the drinker frequents the bar and likes the beer.

62 Sells(bar, beer, price) Likes(drinker, beer) Frequents(drinker, bar) Triggers on Views In general, it is impossible to modify a view, because it doesn’t exist. But an INSTEAD OF trigger let us interpret view modifications in a way that makes sense. Example: we design a view Synergy with tuples (drinker, beer, bar) such that the bar serves the beer, the drinker frequents the bar and likes the beer. CREATE VIEW Synergy AS SELECT Likes.drinker, Likes.beer, Sells.bar FROM Likes, Sells, Frequents WHERE Likes.drinker = Frequents.drinker AND Likes.beer = Sells.beer AND Sells.bar = Frequents.bar;

63 Sells(bar, beer, price) Likes(drinker, beer) Frequents(drinker, bar) Triggers on Views In general, it is impossible to modify a view, because it doesn’t exist. But an INSTEAD OF trigger let us interpret view modifications in a way that makes sense. Example: we design a view Synergy with tuples (drinker, beer, bar) such that the bar serves the beer, the drinker frequents the bar and likes the beer. CREATE VIEW Synergy AS SELECT Likes.drinker, Likes.beer, Sells.bar FROM Likes, Sells, Frequents WHERE Likes.drinker = Frequents.drinker AND Likes.beer = Sells.beer AND Sells.bar = Frequents.bar; Actually, a natural join of Likes, Sells, and Frequents

64 Inserting on a View

65 Inserting on a View We cannot insert into Synergy: it is a view made from Sells, Likes, Frequents.

66 Sells(bar, beer, price) Likes(drinker, beer) Frequents(drinker, bar) Inserting on a View We cannot insert into Synergy: it is a view made from Sells, Likes, Frequents. CREATE VIEW Synergy AS SELECT Likes.drinker, Likes.beer, Sells.bar FROM Likes, Sells, Frequents WHERE Likes.drinker = Frequents.drinker AND Likes.beer = Sells.beer AND Sells.bar = Frequents.bar;

67 Sells(bar, beer, price) Likes(drinker, beer) Frequents(drinker, bar) Inserting on a View We cannot insert into Synergy: it is a view made from Sells, Likes, Frequents. But we can use an INSTEAD OF trigger to turn a (drinker, beer, bar) triple into three insertions of projected pairs, one for each of Likes, Sells, and Frequents. CREATE VIEW Synergy AS SELECT Likes.drinker, Likes.beer, Sells.bar FROM Likes, Sells, Frequents WHERE Likes.drinker = Frequents.drinker AND Likes.beer = Sells.beer AND Sells.bar = Frequents.bar;

68 Inserting on a View CREATE VIEW Synergy AS
Sells(bar, beer, price) Likes(drinker, beer) Frequents(drinker, bar) Inserting on a View CREATE VIEW Synergy AS SELECT Likes.drinker, Likes.beer, Sells.bar FROM Likes, Sells, Frequents WHERE Likes.drinker = Frequents.drinker AND Likes.beer = Sells.beer AND Sells.bar = Frequents.bar;

69 Inserting on a View CREATE TRIGGER ViewTrig
Sells(bar, beer, price) Likes(drinker, beer) Frequents(drinker, bar) Inserting on a View CREATE TRIGGER ViewTrig INSTEAD OF INSERT ON Synergy REFERENCING NEW ROW AS n FOR EACH ROW BEGIN INSERT INTO Likes VALUES (n.drinker, n.beer); INSERT INTO Sells(bar, beer) VALUES(n.bar, n.beer); INSERT INTO Frequents VALUES(n.drinker, n.bar); END; CREATE VIEW Synergy AS SELECT Likes.drinker, Likes.beer, Sells.bar FROM Likes, Sells, Frequents WHERE Likes.drinker = Frequents.drinker AND Likes.beer = Sells.beer AND Sells.bar = Frequents.bar;

70 Inserting on a View CREATE TRIGGER ViewTrig
Sells(bar, beer, price) Likes(drinker, beer) Frequents(drinker, bar) specifically for views Inserting on a View CREATE TRIGGER ViewTrig INSTEAD OF INSERT ON Synergy REFERENCING NEW ROW AS n FOR EACH ROW BEGIN INSERT INTO Likes VALUES (n.drinker, n.beer); INSERT INTO Sells(bar, beer) VALUES(n.bar, n.beer); INSERT INTO Frequents VALUES(n.drinker, n.bar); END; CREATE VIEW Synergy AS SELECT Likes.drinker, Likes.beer, Sells.bar FROM Likes, Sells, Frequents WHERE Likes.drinker = Frequents.drinker AND Likes.beer = Sells.beer AND Sells.bar = Frequents.bar;

71 Inserting on a View CREATE TRIGGER ViewTrig
Sells(bar, beer, price) Likes(drinker, beer) Frequents(drinker, bar) specifically for views Inserting on a View CREATE TRIGGER ViewTrig INSTEAD OF INSERT ON Synergy REFERENCING NEW ROW AS n FOR EACH ROW BEGIN INSERT INTO Likes VALUES (n.drinker, n.beer); INSERT INTO Sells(bar, beer) VALUES(n.bar, n.beer); INSERT INTO Frequents VALUES(n.drinker, n.bar); END; The value for Sells.price will be the default CREATE VIEW Synergy AS SELECT Likes.drinker, Likes.beer, Sells.bar FROM Likes, Sells, Frequents WHERE Likes.drinker = Frequents.drinker AND Likes.beer = Sells.beer AND Sells.bar = Frequents.bar;

72 Inserting on a View CREATE TRIGGER ViewTrig
Sells(bar, beer, price) Likes(drinker, beer) Frequents(drinker, bar) Inserting on a View CREATE TRIGGER ViewTrig INSTEAD OF INSERT ON Synergy REFERENCING NEW ROW AS n FOR EACH ROW BEGIN INSERT INTO Likes VALUES (n.drinker, n.beer); INSERT INTO Sells(bar, beer) VALUES(n.bar, n.beer); INSERT INTO Frequents VALUES(n.drinker, n.bar); END; CREATE VIEW Synergy AS SELECT Likes.drinker, Likes.beer, Sells.bar FROM Likes, Sells, Frequents WHERE Likes.drinker = Frequents.drinker AND Likes.beer = Sells.beer AND Sells.bar = Frequents.bar;

73 Inserting on a View CREATE VIEW Synergy AS
Sells(bar, beer, price) Likes(drinker, beer) Frequents(drinker, bar) Inserting on a View CREATE VIEW Synergy AS SELECT Likes.drinker, Likes.beer, Sells.bar FROM Likes, Sells, Frequents WHERE Likes.drinker = Frequents.drinker AND Likes.beer = Sells.beer AND Sells.bar = Frequents.bar; CREATE TRIGGER ViewTrig INSTEAD OF INSERT ON Synergy REFERENCING NEW ROW AS n FOR EACH ROW BEGIN INSERT INTO Likes VALUES (n.drinker, n.beer); INSERT INTO Sells(bar, beer) VALUES(n.bar, n.beer); INSERT INTO Frequents VALUES(n.drinker, n.bar); END; ……

74 Inserting on a View In the same database schema CREATE VIEW Synergy AS
Sells(bar, beer, price) Likes(drinker, beer) Frequents(drinker, bar) Inserting on a View CREATE VIEW Synergy AS SELECT Likes.drinker, Likes.beer, Sells.bar FROM Likes, Sells, Frequents WHERE Likes.drinker = Frequents.drinker AND Likes.beer = Sells.beer AND Sells.bar = Frequents.bar; In the same database schema CREATE TRIGGER ViewTrig INSTEAD OF INSERT ON Synergy REFERENCING NEW ROW AS n FOR EACH ROW BEGIN INSERT INTO Likes VALUES (n.drinker, n.beer); INSERT INTO Sells(bar, beer) VALUES(n.bar, n.beer); INSERT INTO Frequents VALUES(n.drinker, n.bar); END; ……


Download ppt "CPSC-310 Database Systems"

Similar presentations


Ads by Google