CHECK CHECK后,SQL Server外键仍然不受信任

时间:2016-03-09 13:07:51

标签: sql sql-server tsql foreign-keys

今天我在一个SQL Server数据库中发现了一些使用以下语句不可信的外键约束:

SELECT name, is_not_trusted
FROM   sys.foreign_keys
WHERE is_not_trusted = 1

我尝试使用以下语法快速解决问题,并认为第二次检查将确保FK再次受到信任。

ALTER TABLE dbo.<TableName>
  WITH CHECK CHECK CONSTRAINT <FK_NAME>

该声明已成功完成,但FK仍被报告为“不信任”。我没有找到任何理由呢?有没有人有想法?

我已经有了解决方法。删除和重新创建FK可以解决问题,但我仍然想知道为什么ALTER命令没有效果

1 个答案:

答案 0 :(得分:1)

我的猜测是您使用NOT FOR REPLICATION创建了约束:

CREATE TABLE val(id INT PRIMARY KEY, name VARCHAR(100));

CREATE TABLE tab(id INT IDENTITY(1,1) PRIMARY KEY, 
                 val_id INT);
GO

ALTER TABLE tab WITH NOCHECK 
ADD CONSTRAINT fk_val FOREIGN KEY (val_id) REFERENCES val(Id) NOT FOR REPLICATION;

ALTER TABLE tab NOCHECK CONSTRAINT fk_val;
GO


-- Insert Data
INSERT INTO tab(val_id)
VALUES (10),(20);
GO

INSERT INTO val(id)
VALUES(10),(20);

-- check data
ALTER TABLE tab WITH CHECK CHECK CONSTRAINT fk_val;

-- check is_trusted
SELECT name, is_not_trusted, is_not_for_replication
FROM   sys.foreign_keys
WHERE is_not_trusted = 1;

LiveDemo

输出:

╔═══╦════════╦════════════════╦════════════════════════╗
║   ║  name  ║ is_not_trusted ║ is_not_for_replication ║
╠═══╬════════╬════════════════╬════════════════════════╣
║ 1 ║ fk_val ║ True           ║ True                   ║
╚═══╩════════╩════════════════╩════════════════════════╝