约束和触发器
键和外键
外键约束声明
外键
- 关系声明一个属性(组)为外键;
- 外键引用另一个关系的属性(组);
- 该属性(组)为 UNIQUE 或 PRIMAEY KEY;
- 外键中的值必须在引用关系中出现;
声明外键
-- 属性后添加约束
CREATE TABLE Studio(
name CHAR(3O) PRIMARY KEY,
address VARCHAR(255),
presC# INT REFERENCES MovieExec(cert#)
)
-- 单独添加外键声明
CREATE TABLE Studio(
name CHAR(3O) PRIMARY KEY,
address VARCHAR(255),
presC# INT,
FOREIGN KEY (presC#) REFERENCES MovieExec(cert#)
)
外键约束原则
- 拒绝违法更新:默认原则,破坏引用完整性约束的不执行;
- 级联原则:被引用属性(组)的改变会执行到对应外键上;
- 置空值原则;
- 被引用属性(组)的改变作用于某外键时;
- 将外键值赋 NULL;
CREATE TABLE Studio(
name CHAR(3O) PRIMARY KEY,
address VARCHAR(255),
presC# INT REFERENCES MovieExec(cert#)
ON DELETE SET NULL
ON UPDATE CASCADE
)
延迟约束检查
添加外键
- 当插入新的元组时;
- 首先将外键值赋 NULL;
- 其次将新元组插入引用关系中;
- 最后重新赋外键值;
延迟约束检查
- 当两个属性(组)互为外键时;
- 正常的添加外键无法执行;
- 使用 DEFERRABLE 延迟约束检查;
- 当事务完成后才会检查完整性约束;
CREATE TABLE Studio(
name CHAR(3O) PRIMARY KEY,
address VARCHAR(255),
presC# INT REFERENCES MovieExec(cert#)
ON DELETE SET NULL
ON UPDATE CASCADE
DEFERRABLE
);
属性和元组的约束
非空值约束
- 不允许元组属性值取 NULL;
- 属性后使用 NOT NULL 关键值;
CREATE TABLE Studio(
name CHAR(3O) PRIMARY KEY,
address VARCHAR(255),
presC# INT REFERENCES MovieExec(cert#) NOT NULL
);
基于属性的 CHECK 约束
- 使用 CHECK 关键字,用于属性声明上;
- 在修改元组时进行检查;
- 违法约束则禁止修改;
CREATE TABLE Studio(
name CHAR(3O) PRIMARY KEY,
address VARCHAR(255),
presC# INT REFERENCES MovieExec(cert#) CHECK (presC#>=100000)
);
基于元组的 CHECK 约束
- 使用 CHECK 关键字,用于定义关系上;
- 在修改元组时进行检查;
- 违法约束则禁止修改;
CREATE TABLE Studio(
name CHAR(3O) PRIMARY KEY,
address VARCHAR(255),
presC# INT REFERENCES MovieExec(cert#)
CHECK (name="F" address NOT LIKE "Ms.%")
);
修改表上的约束
添加约束
- ADD 关键字;
ALTER TABLE MovieStar ADD CONSTRAINT NameIsKey
PRIMARY KEY(name);
ALTER TABLE MovieStar ADD CONSTRAINT NameIsKey
CHECK (gender IN ("F","M"));
删除约束
- DROP 关键字;
ALTER TABLE MovieStar DROP CONSTRAINT NameIsKey;
断言和触发器
断言
断言
- 断言为总为真的 SQL 逻辑表达式;
- 任何引起断言失败的数据库更新都会拒绝;
创建断言
- 条件必须是逻辑值;
CREATE ASSERTION <断言名> CHECK (<条件>)
使用断言
CREATE ASSERTION SumLength CHECK (10000>=ALL
(
SELECT SUM(length)
FROM Movies
GROUP BY studioName
)
);
删除断言
DROP ASSERTION <断言名>
触发器
触发过程
- 事件 - 条件 - 动作;
- 发生对应事件,触发器被激活;
- 触发器测试触发条件;
- 触发条件成立,执行对应动作;
创建触发器
- 使用 CREATE TRIGGER 语句;
权限
权限
- SELECT:关系;
- INSERT:关系;
- DELETE:关系;
- UPDATE:关系;
- REFERENCE:完整性约束;
- USAGE:关系和断言之外的模式;
- TRIGGER:触发器;
- EXECUTE:存储过程;
- UNDER:创建子类型;
创建权限
- 创建者和所属用户具有模块的权限;
- AUTHORIZATION 子句确定模块对应的所属用户;
AUTHORIZATION picard;
赋予权限
- 赋予权限给指定用户;
GRANT <权限列表> ON <数据库元素> TO <用户列表>
GRANT SELECT,INSERT ON Studio TO kirk,picard;
回收权限
REVOKE <权限列表> ON <数据库元素> FROM <用户列表> <回收模式>
;- 回收模式;
- CASCADE:逐层回收权限;
- RESTRICT:只回收第一层的权限;
REVOKE SELECT,INSERT ON Studio FROM picard CASCADE;