何时评估检查约束?

时间:2017-06-07 19:29:35

标签: sql-server check-constraints

我有一张记录表

ID
EntityID 
Value
Status

和实体表

ID
Col1
Col2
CurrentRecordID

CurrentRecordID应与Record绑定EntityStatus为0

我有两个检查约束 一个在表Entity上检查以确保CurrentRecordID实际上是当前记录,而Record上的一个检查以确保,如果它的状态为0,则EntityID { {1}}的{​​{1}}与其ID相匹配。

基本上,两个检查约束做同样的事情,但是在每个表上分别进行

检查约束是在事务的最后运行还是在表上每次插入/更新后都像触发器一样运行?

如果它们在每次修改后运行,这两个约束是否会相互冲突(意味着约束会在下一个表有机会更新其值之前抛出错误)。

以下是运行以插入新记录的查询示例,并将其设置为给定实体的当前记录

CurrentRecordID

2 个答案:

答案 0 :(得分:2)

约束不像触发器一样运行。他们在更改数据之前评估规则。

尝试更改数据时会发生约束检查。如果尝试更改为Table1未通过检查约束,则它将通过异常。

答案 1 :(得分:0)

为完成Sean Lange的解释,请允许我留下一个随时可以运行的示例,以便亲眼看看在修改任何数据之前如何执行table check

CREATE TABLE pepe (
    id serial,
    state text NOT NULL
);
ALTER TABLE pepe ADD CONSTRAINT pepe_pk PRIMARY KEY (id);


ALTER TABLE pepe ADD CONSTRAINT pepe_check
CHECK (pepe_check_func());

CREATE OR REPLACE FUNCTION pepe_check_func() RETURNS boolean AS
$BODY$
  DECLARE
    temp_row record;
  BEGIN
    RAISE INFO 'Displaying existing pepe records';
    FOR temp_row IN
        SELECT id,state
        FROM pepe
    LOOP
        RAISE INFO '(id,state) = (%,%)',temp_row.id, temp_row.state;
    END LOOP;
    RETURN TRUE;
  END;
$BODY$ LANGUAGE plpgsql IMMUTABLE;

insert into pepe (state) values ('go');

update pepe
set state = 'active';

select *
from pepe;