PPT - NYU Stern School of Business
Download
Report
Transcript PPT - NYU Stern School of Business
C20.0046: Database
Management Systems
Lecture #21
M.P. Johnson
Stern School of Business, NYU
Spring, 2008
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
1
Agenda
Stored procedures?
Triggers
Transactions
RAID?
Implementation?
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
2
Integration with SQL
DECLARE
l_book_count INTEGER;
BEGIN
SELECT COUNT(*)
INTO l_book_count
FROM books
WHERE author LIKE '%FEUERSTEIN, STEVEN%';
DBMS_OUTPUT.PUT_LINE (
'Steven has written (or co-written) ' || l_book_count ||
' books.');
END;
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
3
Dynamic PL/SQL
E.g.: write function to return number rows in
an arbitrary table
CREATE OR REPLACE FUNCTION rowCount (
tabname IN VARCHAR2) return integer as
retval integer;
begin
execute immediate 'select count(*) from ' || tabname into
retval;
return retval;
end;
/
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
4
Dynamic PL/SQL for DDL
Ordinarily can’t do DDL in PL/SQL
But you can in dynamic PL/SQL
Here’s an e.g.:
CREATE OR REPLACE procedure
dropproc(procname in varchar2) as
begin
execute immediate 'drop procedure ' || procname;
end;
/
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
5
Live examples
Factorial function:
Converting between bases:
http://pages.stern.nyu.edu/~mjohnson/dbms/plsql/
fact.sql
http://pages.stern.nyu.edu/~mjohnson/dbms/plsql/
numsys.sql
Directory of examples:
http://pages.stern.nyu.edu/~mjohnson/dbms/plsql/
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
6
SPs in MySQL (5.0)
Generally similar, though technical diffs
Need to temporarily redefine ; delimiter
mysql> drop procedure if exists hello;
myslq> delimiter /
mysql> create procedure hello()
-> begin
-> select 'hi';
-> end;
-> /
mysql> delimiter ;
mysql> call hello();
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
7
New topic: Triggers
PL/SQL programs that run automatically (are
“triggered”) when a certain event occurs
E.g.: on insert to some table
On system start-up
On delete from table
Big benefit: need not be called explicitly
However row in table x is deleted, the trigger
gets called
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
8
Trigger events
Trigger code may be “triggered” by many kinds of
events:
Oracle start-up/shut-down
Data updates:
Triggers may replace initialization scripts
Delete: maybe delete related rows
Inserts
Updates: maybe make other rows consistent
Delete: maybe prevent
DDL statements
Log creation of all objects, e.g.
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
9
Triggers
Constraints state what must remain true
DBMS decides when to check
Triggers are instructions to perform at explicitly
specified times
Three aspects:
An event (e.g., update to an attribute)
A condition (e.g., a test of that update value)
An action (the trigger’s effect) (deletion, update, insertion)
When the event occurs, DBMS checks the
constraint, and if it is satisfied, performs the action
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
10
DML trigger options
The trigger may be:
The trigger may run
Statement-level (e.g., a DELETE WHERE statement) or
Row-level (e.g., for each row deleted)
BEFORE
AFTER or
INSTEAD OF the statement (in Oracle, not in others)
It may be triggered by
INSERTs
UPDATEs
DELETEs
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
11
Trigger form
CREATE [OR REPLACE] TRIGGER trigger
name
{BEFORE | AFTER | INSTEAD OF}
{INSERT | DELETE | UPDATE | UPDATE OF
column list} ON table name
[FOR EACH ROW]
[WHEN (...)]
[DECLARE ... ]
BEGIN
... executable statements ...
[EXCEPTION ... ]
END [trigger name];
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
12
Trigger type examples
First run copy_tables.sql
1.
statement_vs_row.sql
INSERT INTO to_table SELECT * FROM from_table;
before_vs_after.sql
2.
INSERT INTO to_table SELECT * FROM from_table;
one_trigger_per_type.sql
3.
INSERT INTO to_table VALUES (1);
UPDATE to_table SET col1 = 10;
DELETE to_table;
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
13
DML Trigger e.g.
CREATE OR REPLACE TRIGGER
validate_employee_changes
BEFORE INSERT OR UPDATE
ON employee
FOR EACH ROW
BEGIN
check_age (:NEW.date_of_birth);
check_resume (:NEW.resume);
END;
Q: Why is this (maybe) better than client-side
validation?
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
14
Triggers with WHEN
CREATE OR REPLACE TRIGGER check_raise
AFTER UPDATE OF salary, commission
ON employee
FOR EACH ROW
WHEN ((OLD.salary != NEW.salary OR
(OLD.salary IS NULL AND NEW.salary IS NULL))
OR (OLD.commission != NEW.commission OR
(OLD.commission IS NULL AND NEW.commission IS NULL)))
BEGIN
...
END;
NB: WHEN applies only to row-level triggers
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
15
Triggers with WHEN
Parentheses are required
Can only call built-in functions in when
Packages like DBMS_OUTPUT are not allowed
CREATE OR REPLACE TRIGGER
valid_when_clause
BEFORE INSERT ON frame
FOR EACH ROW
WHEN ( TO_CHAR(SYSDATE,'HH24')
BETWEEN 9 AND 17 )
...
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
16
Simple trigger example
R(id, data, last-modified)
Goal: whenever data is modified, update lastmodified date
Could modify all scripts/programs that touch this
table
CREATE TRIGGER UpdateDateTrigger
data is a large string
Last-modified is a newly added date field
Bad idea
Better: user a trigger
AFTER UPDATE OF data ON R
REFERENCING
NEW ROW AS NewTuple
FOR EACH ROW
BEGIN
NewTuple.last-modified = sysdate;
END;
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
17
Multiple DML actions
DML actions may be ORed together
To find actual
action, check:
INSERTING
DELETING
UPDATING
CREATE OR REPLACE TRIGGER
three_for_the_price_of_one
BEFORE DELETE OR INSERT OR UPDATE
ON account_transaction
FOR EACH ROW
BEGIN
IF INSERTING
THEN
:NEW.created_by := USER;
:NEW.created_date := SYSDATE;
ELSIF DELETING
THEN
audit_deletion(USER,SYSDATE);
18
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
END;
More on UPDATING
UPDATING may be called for partic. columns
CREATE OR REPLACE TRIGGER validate_update
BEFORE UPDATE ON account_transaction
FOR EACH ROW
BEGIN
IF UPDATING ('ACCOUNT_NO')
THEN
errpkg.raise('Account number cannot be updated');
END IF;
END;
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
19
Extended auditing example
Tables: grades, grades_audit
Run: grades_tables.sql, grades_audit.sql
Cases: hacker changes grades, deletes
others
UPDATE grades
SET grade = 'A+'
WHERE student_id = 1
AND class_id = 101;
DELETE grades
WHERE student_id = 2
AND class_id = 101;
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
20
Extended auditing example
Run: grades_tables.sql, grades_audit2.sql
Cases: hacker changes student or class ids
UPDATE grades SET student_id = 3
WHERE student_id = 1 AND class_id = 101;
UPDATE grades SET student_id = 1
WHERE student_id = 2 AND class_id = 101;
UPDATE grades SET student_id = 2
WHERE student_id = 3 AND class_id = 101;
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
21
DDL Triggers
Respond to DDL events
Creating/dropping tables, indices, etc.
ALTER TABLE etc.
General form:
CREATE [OR REPLACE] TRIGGER trigger name
{BEFORE | AFTER| {DDL event} ON
{DATABASE | SCHEMA}
DECLARE
Variable declarations
BEGIN
... some code...
END;
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
22
DDL trigger e.g.
Town crier examples triggered by creates:
uninformed_town_crier.sql
informed_town_crier.sql
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
23
Available DDL events
CREATE, ALTER, DROP, GRANT, RENAME,
REVOKE, TRUNCATE
DDL: any DDL event
no_create.sql
CREATE OR REPLACE TRIGGER no_create
AFTER CREATE ON SCHEMA
BEGIN
RAISE_APPLICATION_ERROR (-20000,
'ERROR : Objects cannot be created in the
production database.');
END;
Q: Does this work??
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
24
DB Event triggers
Form similar to DDL triggers:
CREATE [OR REPLACE] TRIGGER trigger name
{BEFORE | AFTER} {database event} ON
{DATABASE | SCHEMA}
DECLARE
Variable declarations
BEGIN
... some code...
END;
Triggering events: STARTUP, SHUTDOWN,
SERVERERROR, LOGON, LOGOFF
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
25
DB event restrictions
Have BEFORE and AFTER as above, but they
don’t always apply:
No BEFORE STARTUP/LOGON/SERVERERROR
No AFTER SHUTDOWN/LOGOFF
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
26
DB Trigger e.g.
Gather stats before shutdown:
CREATE OR REPLACE TRIGGER on_shutdown
BEFORE SHUTDOWN ON DATABASE
BEGIN
gather_system_stats;
END;
Log error messages
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
27
New-old topic: Transactions
So far, have simply issued commands
Recall, though: an xact is an operation/set of
ops executed atomically
Ignored xacts
In one instant
ACID test:
Xacts are atomic
Each xact (not each statement) must leave the DB
consistent
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
28
Default xact behavior (in Oracle)
An xact begins upon login
By default, xact lasts until logoff
Except for DDL statements
They automatically commit
Examples with two views of tbl…
But with TYPE=innodb !
mysql> set autocommit = 0
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
29
Direct xact instructions
At any point, may explicitly COMMIT:
Conversely, can ROLLBACK
SQL> COMMIT;
Saves all statements entered up to now
Begins new xact
SQL> ROLLBACK;
Cancels all statements entered since start of xact
Example: delete from emp; or delete junk;
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
30
Direct xact instructions
Remember, DDL statements are autocommitted
They cannot be rollbacked
Examples:
drop table junk;
rollback;
truncate table junk;
rollback;
Q: Why doesn’t rollback “work”?
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
31
Savepoints
Xacts are atomic
Can rollback to beginning of current xact
But might want to rollback only part way
Make 10 changes, make one bad change
Want to: roll back to before last change
Don’t have Word-like multiple undo
But do have savepoints
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
32
Savepoints
Create a savepoint:
SAVEPOINT savept_name;
--changes
emp example:
SAVEPOINT sp1;
--changes
Can skip savepoints
SAVEPOINT sp2;
But can ROLLBACK --changes
only backwards
SAVEPOINT sp3
--changes
Can ROLLBACK
only to last COMMIT ROLLBACK TO SAVEPOINT sp2;
ROLLBACK TO SAVEPOINT sp1;
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
33
AUTOCOMMIT
Finally, can turn AUTOCOMMIT on:
Oralce: SQL> SET AUTOCOMMIT ON;
Mysql: mysql> SET AUTOCOMMIT=1;
Can put this in your config file
Can specify through JDBC, etc.
Then each statement is auto-committed as its
own xact
Not just DDL statements
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
34
RAID levels
RAID level 1: each disk gets a mirror
RAID level 4: one disk is xor of all others
Each bit is sum mod 2 of corresponding bits
E.g.:
Disk 1: 10110011
Disk 2: 10101010
Disk 3: 00111000
Disk 4:
How to recover?
What’s the disadvantage of R4?
Various other RAID levels in text…
M.P. Johnson, DBMS, Stern/NYU, Spring 2008
35