跳到主要内容

约束和触发器

键和外键

外键约束声明

外键
  • 关系声明一个属性(组)为外键;
  • 外键引用另一个关系的属性(组);
    • 该属性(组)为 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;