在网上找的相关sql语句,一个关闭所有,一个打开所有,但我在关闭后,插入一条记录,如果这个记录不符合两个表的关系,在打开关系后怎样让这个记录回滚回去,现在的情况是这记录插入进去了。
ALTER TABLE table NOCHECK CONSTRAINT ALLALTER TABLE table CHECK CONSTRAINT ALL         

解决方案 »

  1.   

    既然已经插入了(事务已经提交),就没有办法回滚了。if OBJECT_ID('ftab') is not null
     drop table ftab;
    go
    create table ftab (id int primary key, c char(1));
    go
    insert into ftab values(1,'A'), (2,'B'), (3,'C');
    goif OBJECT_ID('ctab') is not null
     drop table ctab;
    go
    create table ctab (id int identity, fid int constraint fk_ctab_id references ftab(id));
    go
    insert into ctab(fid) values(1),(2),(3);
    go-- 禁用外键约束
    alter table ctab nocheck constraint fk_ctab_id;
    -- 插入不匹配记录
    insert into ctab(fid) values(5);
    -- 启用外键约束,但是不会检测表中当前的数据是否满足外键约束
    alter table ctab check constraint fk_ctab_id;-- 删除不匹配的记录
    delete from ctab where fid not in (select id from ftab);
      

  2.   

    事务回滚是不可能了加一个 with check,检查数据库中的所有有行是否仍然满足约束
    ALTER TABLE table with check CHECK CONSTRAINT ALL