今天我在一个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命令没有效果
答案 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 ║
╚═══╩════════╩════════════════╩════════════════════════╝