Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 打开和关闭外键约束_Sql Server 2008_Tsql - Fatal编程技术网

Sql server 2008 打开和关闭外键约束

Sql server 2008 打开和关闭外键约束,sql-server-2008,tsql,Sql Server 2008,Tsql,我们有一个漫长的ETL过程,将数据从输入文件流到一系列表中 我考虑不太可能将关系完整性添加到表中,但我不希望ETL过程在遇到冲突时死亡。我还希望仍然加载违反引用完整性的记录。然而,最后,我想知道所有违反引用完整性的行为 方法1: 我可以关闭引用完整性,编写一个SQL过程,运行一组存储过程来识别违反关系完整性的记录,但我非常喜欢将关系完整性放在表本身上的想法,因为我觉得这样可以将数据库记录在最佳位置—db 方法2: 与编写一组自定义查询来识别违规者不同,我认为我们应该在流程开始时删除所有ref i

我们有一个漫长的ETL过程,将数据从输入文件流到一系列表中

我考虑不太可能将关系完整性添加到表中,但我不希望ETL过程在遇到冲突时死亡。我还希望仍然加载违反引用完整性的记录。然而,最后,我想知道所有违反引用完整性的行为

方法1: 我可以关闭引用完整性,编写一个SQL过程,运行一组存储过程来识别违反关系完整性的记录,但我非常喜欢将关系完整性放在表本身上的想法,因为我觉得这样可以将数据库记录在最佳位置—db

方法2: 与编写一组自定义查询来识别违规者不同,我认为我们应该在流程开始时删除所有ref integrity,然后在流程结束时添加它。在我们得到例外的地方,我们知道有违反。我有点喜欢这种方法,但是uunlike方法1可以编写SQL,只针对刚刚为潜在违规者添加的记录,再添加ref integrity可能会重新检查整个表——一个不断增长的表。当ref integrity重新打开时,数据使用者可以确保数据“良好”,而无需再进行任何即时查询。我喜欢

有第三种方法吗? 我看到T-SQL支持如下命令

NOCHECK CONSTRAINT  
ON UPDATE  NO ACTION  
ON INSERT  NO ACTION
但我不确定它们的真正用途。比如说,

ALTER TABLE dbo.TableName NOCHECK约束FK01

这样做的目的是在您有可靠来源时关闭ConstructionMT检查吗?我假设,如果以这种方式关闭然后打开,则设置chg仅适用于未来的操作


您将使用什么样的最佳方法来允许一个流程完成到底,并且仍然能够识别所有关系完整性或潜在的关系完整性冲突

我个人永远不会关闭FK约束。这是滑向地狱的开始。他们在那里是有原因的


我会将您的ETL拆分为N行的批处理,并将每一行包装在一个事务中。如果事务因FK冲突而失败,请记录它并执行恢复要求的任何操作。永远不要将坏数据留在中。

1。我发现
无操作
名称有点误导,因为它意味着如果DML违反约束,它将失败。一些RDM,特别是mysql,有一个更好的关键字-
RESTRICT
,更具描述性。

2.您可以使用
ALTER TABLE。。。NOCHECK/CHECK CONSTRAINT ALL

我们有一个类似的情况,客户日常依赖的现有任务可能会导致无效数据,但不会影响他们的业务。我选择了您的选项1,因为我们可以在现场运行自定义验证程序,查看哪些数据已经无效,以便在启用要添加的完整性约束之前,我们知道需要修复哪些(数据和程序)。