sql - 在 SQL 编码中可以在 TRIGGER 中使用 DEFERRABLE 吗? DEFERRABLE 是如何工作的?

标签 sql oracle triggers

可以在触发器中使用 DEFERRABLE 吗?

DEFERRABLE 的概念是如何工作的?

它在整个事务期间然后在所有操作结束时检查约束?

最佳答案

看起来您的意思是 PostgresSql。一个DEFERRABLE CONSTRAINT的概念是一个可能在事务过程中暂时失效的约束(使用 SET CONSTRAINTS ... DEFERRED; 命令),但约束必须在事务提交时再次有效。

例如,下面有一个 FOREIGN KEYTable2.Table1ID 强制执行参照完整性的约束至 Table1.ID :

CREATE TABLE Table1
(
  ID INT NOT NULL,
  Name VARCHAR(50),
  CONSTRAINT PK_Table1 PRIMARY KEY(ID)
);

CREATE TABLE Table2
(
  ID INT NOT NULL,
  Table1ID INT NOT NULL,
  Name VARCHAR(50),
  CONSTRAINT PK_Table2 PRIMARY KEY(ID),
  CONSTRAINT FK_Table2_Table1 FOREIGN KEY(Table1ID) REFERENCES Table1(ID) DEFERRABLE
);

通常,如果没有带有 Table1.ID = 2 的行,下面的插入会失败。 :
INSERT INTO TABLE2(ID, Table1Id, Name) VALUES (2, 2, 'Foreign Key Violation');

但是,因为 CONSTRAINT 被定义为 DEFERRABLE (并且我们在下面的事务中允许延迟约束),这意味着我们可能会暂时违反约束,前提是在提交事务时满足约束。在下面的示例中,我们通过在表 1 中插入额外的行来消除参照完整性约束来解决外键违规问题。
BEGIN TRANSACTION;
SET CONSTRAINTS ALL DEFERRED;
INSERT INTO Table2(ID, Table1Id, Name) VALUES (2, 2, 'Foreign Key Violation Allowed');
INSERT INTO Table1(ID, Name) VALUES (2, 'Fix the Violation');
COMMIT TRANSACTION;

SqlFiddle of a DEFERRED RI insert here

关于触发器,DEFERRED只能与 CONSTRAINT TRIGGERS 一起使用,但上述原则同样适用。

关于sql - 在 SQL 编码中可以在 TRIGGER 中使用 DEFERRABLE 吗? DEFERRABLE 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29722082/

相关文章:

Excel 触发宏

mysql - 获取 mysql 结果的最佳方法

mysql - 我想动态创建存储过程以逗号分隔的列和值

sql - Oracle 正确获取月份差异

sql - Oracle SQL 组问题

sql - Oracle 查询结果与企业管理器值不匹配

mysql - 使用 MySQL 触发器替换输入

c# - 存储恒定数据流的最佳实践

sql - Azure 数据工厂 V2 : How to pass a file name to stored procedure variable

php - 类似于 MySQL 中的符号链接(symbolic link)的东西?