Database Systems I
SQL Constraints and Triggers
Ensuring business rules are met.
INTEGRITY CONSTRAINTS

An integrity constraint (IC) describes conditions
that every legal instance of a relation must
satisfy.



Inserts/deletes/updates that violate IC’s are
disallowed.
Can be used to ensure application semantics (e.g., sid
is a key), or prevent inconsistencies (e.g., sname has to
be a string, age must be < 200).
Types of IC’s:
domain constraints and NOT NULL constraints,
 primary key constraints and foreign key constraints,
 general constraints.

2
NOT-NULL CONSTRAINTS

The IC NOT NULL disallows NULL values for a
specified attribute.
CREATE TABLE Students
(sid CHAR(20) PRIMARY KEY,
name CHAR(20) NOT NULL,
login CHAR(10) NOT NULL,
age INTEGER,
gpa REAL);
Primary key attributes are implicitly NOT NULL.
3
GENERAL CONSTRAINTS

Attribute-based CHECK
defined in the declaration of an attribute,
 activated on insertion to the corresponding table or
update of attribute.


Tuple-based CHECK
defined in the declaration of a table,
 activated on insertion to the corresponding table or
update of tuple.


Assertion
defined independently from any table,
 activated on any modification of any table mentioned
in the assertion.

4
ATTRIBUTE-BASED CHECK
Attribute-based CHECK constraint is part of an
attribute definition.
 Is checked whenever a tuple gets a new value for
that attribute (INSERT or UPDATE)
 Violating modifications are rejected
 CHECK constraint can contain an SQL query
referencing other attributes (of the same or other
tables), if their relations are mentioned in the
FROM clause
 CHECK constraint is not activated if other
attributes mentioned get new values

5
ATTRIBUTE-BASED CHECK

Ex: not null constraint

Ex: sex char(1) CHECK (sex IN (‘F’, ‘M’))

domain constraint

Ex: Create domain gender-domain CHAR (1)
CHECK (VALUE IN (‘F’, ‘M’))

define sex in schema definition to be of type genderdomain
6
ATTRIBUTE-BASED CHECK

Attribute-based CHECK constraints are most
often used to restrict allowable attribute values.
CREATE TABLE Sailors
( sid INTEGER PRIMARY KEY,
sname CHAR(10),
rating INTEGER
CHECK ( rating >= 1
AND rating <= 10),
age REAL);
7
TUPLE-BASED CHECK
Tuple-based CHECK constraints can be used to
constrain multiple attribute values within a table.
 Condition can be anything that can appear in a
WHERE clause.
 Same activation and enforcement rules as for
attribute-based CHECK.

CREATE TABLE Sailors
( sid INTEGER PRIMARY KEY,
sname CHAR(10),
previousRating INTEGER,
currentRating INTEGER,
age REAL,
CHECK (currentRating >= previousRating)
);
8
TUPLE-BASED CHECK

Tuple Based CHECK contraint:
CREATE TABLE Emp (
name CHAR(30) UNIQUE
gender CHAR(1) CHECK (gender in (‘F’, ‘M’)
age int
dno int
CHECK (age < 100 AND age > 20)
CHECK (dno IN (SELECT dno FROM dept))
)
these are checked on insertion to relation or tuple update
9
TUPLE-BASED CHECK

CHECK constraint that refers to other table:
CREATE TABLE Reserves
( sname CHAR(10),
Interlake boats
bid INTEGER,
cannot be reserved
day DATE,
PRIMARY KEY (bid,day),
CHECK (‘Interlake’ <>
( SELECT B.bname
FROM Boats B
WHERE B.bid=bid)));

But: these constraints are invisible to other
tables, i.e. are not checked upon modification of
other tables.
10
TUPLE-BASED CHECK
CREATE TABLE dept (
mgrname CHAR(30)
dno int
dname CHAR(20)
check (mgrname NOT IN (SELECT name
FROM emp
WHERE emp.sal < 50000))
)


If someone made a manager whose salary is less than 50K
that insertion/update to dept table will be rejected.
However, if manager’s salary reduced to less than 50K, the
corresponding update to emp table will NOT be rejected.
11
ASSERTIONS

Number of boats plus number of sailors is < 100.
CREATE TABLE Sailors
( sid INTEGER,
sname CHAR(10),
rating INTEGER,
age REAL,
PRIMARY KEY (sid),
CHECK
( (SELECT COUNT (S.sid) FROM Sailors S)
+ (SELECT COUNT (B.bid) FROM Boats B) < 100 )
);



Tuple-based CHECK awkward and wrong!
If Sailors is empty, the number of Boats tuples can be
anything!
ASSERTION is the right solution; not associated with either
table.
12
ASSERTIONS
Assertions are constraints over a table as a whole
or multiple tables.
 General form:


CREATE ASSERTION <name> CHECK <cond>
An assertion must always be true at transaction
boundaries. Any modification that causes it to
become false is rejected.
 Similar to tables, assertions can be dropped by a
DROP command.

13
ASSERTIONS
Condition can be anything allowed in a WHERE
clause.
 Constraint is tested whenever any (!) of the
referenced tables is modified.
 Different from CHECK constraints, ICs expressed
as assertion are always enforced (unless they are
deferred until the end of the transaction).
 CHECK constraints are more efficient to
implement than ASSERTIONs.

14
ASSERTIONS



Number of boats plus number of sailors is < 100.
CREATE ASSERTION smallClub
CHECK
( (SELECT COUNT (S.sid) FROM Sailors S)
+ (SELECT COUNT (B.bid) FROM Boats B) < 100 );
All relations are checked to comply with above.
Number of reservations per sailor is < 10.
CREATE ASSERTION notTooManyReservations
CHECK ( 10 > ALL
(SELECT COUNT (*)
FROM Reserves
GROUP BY sid)
);
15
EXAMPLE ASSERTION

CREATE ASSERTION RichMGR CHECK
(NOT EXISTS
(SELECT *
FROM dept, emp
WHERE emp.name = dept.mgrname AND
emp.salary < 50000))
This assertion correctly guarantees that each manager makes
more than 50000.
If someone made a manager whose salary is less than 50K
that insertion/update to dept table will be rejected.
Furthermore, if manager’s salary reduced to less than 50K,
the corresponding update to emp table will be rejected.
16
DIFFERENT CONSTRAINT TYPES
Type
Where Declared
When activated Guaranteed
to hold?
Attribute
CHECK
with attribute
on insertion
or update
not if contains
subquery
Tuple
CHECK
relation schema
insertion or
update to
relation
not if contains
subquery
Assertion
database schema
on change to Yes
any relation
mentioned
17
ALTERING CONSTRAINTS
ALTER TABLE Product DROP CONSTRAINT
positivePrice
ALTER TABLE Product ADD CONSTRAINT
positivePrice CHECK (price >= 0)
ALTER DOMAIN ssn ADD CONSTRAINT no-leading-1s
CHECK (value >= 200000000)
DROP ASSERTION assert1.
18
TRIGGERS
TRIGGERS


Trigger: procedure that starts automatically if
specified changes occur to the DB.
Three parts of a trigger:




Event (activates the trigger)
insert, delete or update of the database
Condition (tests whether the trigger should run)
a Boolean statement or a query (nonempty answer set
= true, empty answer set = false)
Action (what happens if the trigger runs)
wide variety of options
The action can refer to both the old and new state of the
database.
20
TRIGGERS




Synchronization of the Trigger with the activating
statement (DB modification)
 Before
 After
 Instead of
 Deferred (at end of transaction).
Update events may specify a particular column or set of
columns.
A condition is specified with a WHEN clause.
Number of Activations of the Trigger
 Once per modified tuple
(FOR EACH ROW)
 Once per activating statement
(default).
21
TRIGGERS

Options for the REFERENCING clause:
NEW TABLE: the set (!) of tuples newly inserted
(INSERT).
 OLD TABLE: the set (!) of deleted or old versions of
tuples (DELETE / UPDATE).
 OLD ROW: the old version of the tuple (FOR EACH
ROW UPDATE).
 NEW ROW: the new version of the tuple (FOR EACH
ROW UPDATE).


The action of a trigger can consist of multiple SQL
statements, surrounded by BEGIN . . . END.
22
TRIGGERS
CREATE TRIGGER youngSailorUpdate
AFTER INSERT ON SAILORS
/* Event */
REFERENCING NEW TABLE NewSailors
FOR EACH STATEMENT
INSERT
/* Action */
INTO YoungSailors(sid, name, age, rating)
SELECT sid, name, age, rating
FROM NewSailors N
WHERE N.age <= 18;


This trigger inserts young sailors into a separate table.
It has no (i.e., an empty, always true) condition.
23
EXAMPLE: ROW LEVEL TRIGGER
CREATE TRIGGER
NoLowerPrices
AFTER UPDATE OF price ON Product
REFERENCING
OLD AS OldTuple
NEW AS NewTuple
WHEN (OldTuple.price > NewTuple.price)
UPDATE Product
SET price = OldTuple.price
WHERE name = NewTuple.name
FOR EACH ROW
24
TRIGGERS
CREATE TRIGGER notTooManyReservations
AFTER INSERT ON Reserves
/* Event */
REFERENCING NEW ROW NewReservation
FOR EACH ROW
WHEN (10 <= (SELECT COUNT(*) FROM Reserves
WHERE sid =NewReservation.sid))
/* Condition */
DELETE FROM Reserves R
WHERE R.sid= NewReservation.sid
/* Action */
AND day=
(SELECT MIN(day) FROM Reserves R2 WHERE
R2.sid=R.sid);


This trigger makes sure that a sailor has less than 10
reservations, deleting the oldest reservation of a given
sailor, if neccesary.
It has a non- empty condition (WHEN).
25
TRIGGERS VS. GENERAL CONSTRAINTS

Triggers can be harder to understand.
Several triggers can be activated by one SQL
statement (arbitrary order!).
 A trigger may activate other triggers (chain
activation).


Triggers are procedural.
Assertions react on any database modification, trigger
only only specified event.
 Trigger execution cannot be optimized by DBMS.


Triggers have more applications than constraints.
monitor integrity constraints,
 construct a log,
 gather database statistics, etc.

26
SUMMARY
SQL allows specification of rich integrity
constraints (ICs): attribute-based, tuple-based
CHECK and assertions (table-independent).
 CHECK constraints are activated only by
modifications of the table they are based on,
ASSERTIONs are activated by any modification
that can possibly violate them.
 Choice of the most appropriate method for a
particular IC is up to the DBA.
 Triggers respond to changes in the database. Can
also be used to represent ICs.

27
Database Systems I
SQL Stored Procedures
EXAMPLE PROCEDURE
29
STORED PROCEDURES

What is a stored procedure:
Program executed through a single SQL statement
 Executed in the process space of the server


Advantages:
Can encapsulate application logic while staying “close”
to the data
 Reuse of application logic by different users
 Avoid tuple-at-a-time return of records through
cursors

30
STORED PROCEDURES: EXAMPLES
CREATE PROCEDURE ShowNumReservations
SELECT S.sid, S.sname, COUNT(*)
FROM Sailors S, Reserves R
WHERE S.sid = R.sid
GROUP BY S.sid, S.sname
Stored procedures can have parameters:
 Three different modes: IN, OUT, INOUT
CREATE PROCEDURE IncreaseRating(
IN sailor_sid INTEGER, IN increase INTEGER)
UPDATE Sailors
SET rating = rating + increase
WHERE sid = sailor_sid
31
STORED PROCEDURES
Stored procedure do not have to be written in SQL:
CREATE PROCEDURE TopSailors(
IN num INTEGER)
LANGUAGE JAVA
EXTERNAL NAME “file:///c:/storedProcs/rank.jar”
32
CALLING STORED PROCEDURES
EXEC SQL BEGIN DECLARE SECTION
Int sid;
Int rating;
EXEC SQL END DECLARE SECTION
// now increase the rating of this sailor
EXEC CALL IncreaseRating(:sid,:rating);
33
Database Systems I
SQL Transactions
Ensuring database consistency one query at a time.
TRANSACTIONS




So far, we have implicitly assumed that there is
only one DB user who executes one SQL
statement at a time.
In reality, a DBS may have many concurrent
users.
Each user may issue a sequence of SQL
statements that form a logical unit (transaction).
The DBS is in charge of ordering the SQL
statements from different users in a way
(serializable) that produces the same results as if
the statements would have been executed in a
single user scenario.
35
SERIALIZABILITY


T1:
T2:
Consider two users who simultaneously want to
book a seat on a certain flight: they first find an
empty seat and then book it (set it occupied).
In an unconstrained system, their operations
might be executed in the following order:
find empty
seat 22A,
book seat 22A
find empty
seat 22A,
book seat 22A
time

In the end, who gets seat 22A?
36
SERIALIZABILITY


To avoid such a problem, we need to consider the
sequence of statements of a user transaction as a
unit.
Statements from two different user transactions
must be ordered in a way that is equivalent to
both transactions being performed serially in
either order



transaction 1 before transaction 2
transaction 2 before transaction 1
In our example, either user 1 or user 2 would get
seat 22A. The other user would see 22A as
occupied and would have to find another seat.
37
ATOMICITY



So far, we have also assumed that all SQL
statements are executed correctly.
In reality, various types of system errors can
occur during the execution of a user transaction.
At the time of a system crash, transactions can
be incomplete: some, but not all of their SQL
statements have been executed.
38
ATOMICITY

Consider a bank transaction T:
T:
A=A+100, B=B-100
time



T is transferring $100 from B’s account to A’s
account.
What if the system crashes right after the first
statement of T has been executed, i.e. the second
statement is not executed?
The DBS has to ensure that every transaction is
treated as an atomic unit, i.e. either all or none
of its SQL statements are executed.
39
TRANSACTIONS


A user’s program may carry out many operations
on the data retrieved from the database, but the
DBMS is only concerned about what data is
read/written from/to the database.
A transaction is the DBMS’s abstract view of a
user program: a sequence of DB reads (R) and
writes (W).
T:
A=A+100, B=B-100
User’s view
T:
R(A), W(A), R(B), W(B)
System’s view
time
40
SERIALIZABILITY


Serial schedule: Schedule that does not
interleave the SQL statements of different
transactions.
Equivalent schedules: For any database state,
the effect of executing the first schedule is
identical to the effect of executing the second
schedule:
The resulting DB instance / state.
 The result of read operations, i.e. what the user sees.


Serializable schedule: A schedule that is
equivalent to some serial schedule.
41
SERIALIZABILITY


Serializability is normally ensured by locking the
DB objects read or written.
Before reading or writing a DB object (table or
tuple), the transaction needs to obtain the
appropriate lock:





Shared locks for reading,
Exclusive locks for writing,
View locks to prevent new tuples from being
returned by a repeated reading.
Locks are normally released only at the end of a
transaction.
If a transaction cannot get the lock it has
requested, it needs to wait until it is realeased
by the other transaction currently holding it.
42
TRANSACTIONS IN SQL

By default, each SQL statement (any query or
modification of the database or its schema) is
treated as a separate transaction.


Transaction includes the effects of triggers.
Transactions can also be defined explicitly.
START TRANSACTION;
<sequence of SQL statements>
COMMIT;
or ROLLBACK;

COMMIT makes all modifications of the
transaction permanent, ROLLBACK undoes all
DB modifications made.
43
READ-ONLY TRANSACTIONS




A transaction that reads only (and does not write
the DB) is easy to serialize with other read-only
transactions.
Only shared locks need to be set.
This means that read-only transactions do not
need to wait for each other, and the throughput
of the DBS can be maximized.
To specify the next transaction as read-only:
SET TRANSACTION READ ONLY;
44
DIRTY READS


T1:
T2:


Dirty data is data that has been modified by a
transaction that has not yet committed.
If that transaction is rolled back after another
transaction has read its dirty data, a nonserializable schedule results.
R(A), W(A),
R(B), W(B), Rollback
R(A), W(A), Commit
Consider T1 who wants to book two seats and T2
who wants to book one seat.
T2 does not get his favorite seat or maybe not
even any seat on his favorite flight, although he
could have if he had waited for the end of T1.
45
ISOLATION LEVELS




Control the degree of locking which occurs when
selecting data
SQL allows you to specify four different isolation
levels for a transaction.
SET TRANSACTION ISOLATION LEVEL . . . ;
The isolation level of a transaction defines what
data that transaction may see
Note that other, concurrent transactions may be
executed at different isolation levels
46
ISOLATION LEVELS

SERIALIZABLE

This isolation level specifies that all transactions occur in a
completely isolated fashion



i.e., as if all transactions in the system had executed serially, one after
the other
The DBMS may execute two or more transactions at the same
time only if the illusion of serial execution can be maintained
REPEATABLE READ
All data records read by a SELECT statement cannot be
changed
 if the SELECT statement contains any ranged WHERE
clauses, phantom reads can occur

Phantom Read: 3rd query returns
identical results as 1st query.
47
ISOLATION LEVELS

READ COMMITTED
Data records retrieved by a query are not prevented
from modification by some other transactions
 Non-repeatable reads may occur



READ UNCOMMITTED

dirty reads are allowed


data retrieved in a SELECT statement may be modified by
some other transaction when it commits
One transaction may see uncommitted changes made by
some other transaction
Default isolation level

varies quite widely
48
ISOLATION LEVELS

The semantics of the four different isolation
levels is defined as follows:
Isolation Level
Write
locks
Read Uncommitted No
Read
locks
No
View
locks
No
Read Committed
Yes
No
No
Repeatable Reads
Yes
Yes
No
Serializable
Yes
Yes
Yes
49
TRANSACTIONS

Requirements for transactions:
Atomicity: “all or nothing”,
 Consistency: transforms consistent DB state into
another consistent DB state,
 Independence: from all other transactions
(serializability),
 Durability: survives any system crashes.


These requirements are called ACID properties
of transactions.
50
SUMMARY




A transaction consists of a sequence of read /
write operations.
The DBMS guarantees the atomicity,
consistency, independence and durability of
transactions.
Serializability guarantees independence of
transactions.
Lower isolation levels can be specified. They may
be acceptable and more efficient in certain
scenarios.
51