sql - 为子表中的列添加检查约束
问题描述
我有 2 张桌子
帐户:
ID (NUMBER), type_of_acc (VARCHAR), (only values ADMIN or USER);
禁止:
ID_A(NUMBER), ID_U(NUMBER);
两者ID_A
和都是从 tableID_U
引用的外键。ID
Account
我需要添加一个检查 ID_A 只有值 ID 的约束
WHERE type_of_acc = 'ADMIN'
解决方案
正如您在Oracle 文档CHECK
中看到的那样,在您的用例中,由于多种原因,您无法执行约束条件,特别是因为:
检查约束的条件可以引用表中的任何列,但不能引用其他表的列。
和:
检查约束条件不能包含以下结构:
- 子查询和标量子查询表达式
- 调用用户定义的函数
为了在功能上实现这一点,可能要走的路是为您的BAN
表创建一个触发器。例如考虑:
CREATE OR REPLACE TRIGGER tg_ban_boiu
BEFORE INSERT OR UPDATE
ON BAN
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
v_aux NUMBER;
BEGIN
IF :NEW.id_a IS NOT NULL THEN
SELECT COUNT(*) INTO v_aux
FROM account
WHERE id = :NEW.id_a
AND type_of_acc = 'ADMIN';
IF v_aux = 0 THEN
RAISE_APPLICATION_ERROR(-20001, 'Invalid value for ID_A');
END IF;
END IF;
END;
推荐阅读
- scala - 从发布请求中获取标头 - Finch (Finagle)
- javascript - JavaScript、AJAX
- native-base - 反应原生基本选项卡样式
- jquery - 加载网页以生成 cookie,然后转到另一个网站
- iis - 通过 IIS 将 http 重定向到 https
- laravel - 拉拉维尔 5.6。唯一的验证规则。从扫描中排除当前记录的字段,如果它没有改变
- azure - 如何将数据从 azure iot 推送到 unity 3D
- android - 在活动布局中将 TextView 移动到背景或前景
- r - 如何在 R 中进行自定义堆叠?
- javascript - 函数返回未定义值