Cyb*_*low 7 sql oracle triggers
可以在触发器中使用DEFERRABLE吗?
DEFERRABLE的概念如何运作?
在整个交易过程中,它会在所有操作结束时检查约束吗?
看起来你的意思是PostgresSql.a的概念DEFERRABLE CONSTRAINT是在事务过程中可能暂时失效的概念(使用SET CONSTRAINTS ... DEFERRED;命令),但约束必须在提交事务时再次有效.
例如,下面,有一个FOREIGN KEY约束强制从参照完整性Table2.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
);
Run Code Online (Sandbox Code Playgroud)
通常情况下,如果没有行,则下面的插入会失败Table1.ID = 2:
INSERT INTO TABLE2(ID, Table1Id, Name) VALUES (2, 2, 'Foreign Key Violation');
Run Code Online (Sandbox Code Playgroud)
但是,因为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;
Run Code Online (Sandbox Code Playgroud)
关于触发器,DEFERRED只能与CONSTRAINT TRIGGERS一起使用,但上述相同的原理适用.
| 归档时间: |
|
| 查看次数: |
740 次 |
| 最近记录: |