【发布时间】:2010-04-29 19:13:26
【问题描述】:
我有几个表添加了外键约束。这些与代码生成一起用于在生成的存储过程中设置特定的连接。
是否可以通过在事务中调用多个删除来覆盖这些约束,特别是 C# 中的“TransactionScope”,还是绝对需要级联删除?
【问题讨论】:
标签: sql sql-server sql-server-2008 transactions constraints
我有几个表添加了外键约束。这些与代码生成一起用于在生成的存储过程中设置特定的连接。
是否可以通过在事务中调用多个删除来覆盖这些约束,特别是 C# 中的“TransactionScope”,还是绝对需要级联删除?
【问题讨论】:
标签: sql sql-server sql-server-2008 transactions constraints
不要使用级联删除,那样会导致严重的性能问题。最好的过程是按从最低的子表到父表的顺序进行删除。
禁用外键是解决数据完整性问题的方法。唯一应该由经验丰富且非常了解可能导致的问题的 DBA 来执行此类操作。如果您问这个问题,那么您还没有足够的经验来使用该技术。请记住,当您禁用 FK 时,您会为所有人禁用它,而不仅仅是您的进程。
【讨论】:
...Foreign Key constraints are added. These are used with code generation to set up specific joins in generated stored procedures.
“覆盖”foreign key constraint 的唯一方法是禁用它:
禁用 FOREIGN KEY 约束允许修改表中的数据而无需通过约束验证。如果新数据将违反约束或约束应仅应用于数据库中已有的数据,则在 INSERT 和 UPDATE 语句期间禁用 FOREIGN KEY 约束。
您需要使用ALTER TABLE 命令禁用约束,使用NOCHECK 关键字。即:
ALTER TABLE dbo.cnst_example NOCHECK CONSTRAINT salary_cap;
唯一的其他选择是删除约束,并在必要时重新添加。
这样做的必要性应该会引发关于如何为表格建模的讨论,因此没有必要这样做。
【讨论】:
您不能覆盖 FK 约束,如果可以的话,首先创建它们有什么意义?
【讨论】:
如果您的 FK 约束是专门为存储过程中的特定用途而设置的,那么这些不是真的 FK,不是吗?一个不错的解决方案是通过在 proc 的开头创建约束来更新相应的代码,并在代码完成时清除它们。然后不要忘记处理无法根据数据检查临时约束的情况。
【讨论】:
可以将约束设置为立即或延迟到事务结束。延迟到事务结束允许您在构建事务时违反约束,但在事务结束时强制执行它们。据我了解,延迟到交易结束可能是您所追求的。
【讨论】: