SQL Server: Deleting Rows with Foreign Key Constraints: Can Transactions override the constraints?

£可爱£侵袭症+ 提交于 2019-12-23 09:34:35

问题


I have a few tables where Foreign Key constraints are added. These are used with code generation to set up specific joins in generated stored procedures.

Is it possible to override these constraints by calling multiple deletes within a transaction, specifically "TransactionScope" in C# or is cascaded deleting absolutely required?


回答1:


Do not use cascade delete, you can cause serious performance issues that way. The best procedure is to do the deletes in order from the lowest child table up to the parent table.

Disabling the foreign keys is a prescription for having data integrity problems. The only time something like that should be done is by a DBA who is extremely experienced and well aware of the issues that could cause. If you are asking this question, you are not yet experienced enough to use that technique. Remember when you disable the FK, you disable it for everyone not just your process.




回答2:


The only way to "override" a foreign key constraint is to disable it:

Disabling a FOREIGN KEY constraint enables data in the table to be modified without being validated by the constraints. Disable a FOREIGN KEY constraint during INSERT and UPDATE statements if new data will violate the constraint or if the constraint should apply only to the data already in the database.

You need to use the ALTER TABLE command to disable a constraint, using the NOCHECK keyword. IE:

ALTER TABLE dbo.cnst_example NOCHECK CONSTRAINT salary_cap;

The only other alternative is to drop the constraint, and re-add when necessary.

The necessity of doing this should lead to discussions about how to model the tables so this is not necessary.




回答3:


You can't override FK constrains, if you could what would be the point of creating them in the first place?




回答4:


If your FK constraints are specifically set for specific use in stored procedures, these are not really FK's, aren't they? a nice solution would be to update the corresponding code by creating the constraints at the beginning of the proc, and clearing them when your code is done. Do not forget then to deal with the case where your temporary constraint cannot be checked against the data.




回答5:


Constraints can be set to either immediate, or delayed to the end of a transaction. Delaying to the end of a transaction allows you to violate the constraints while you are building the transaction, but enforce them at the end of the transaction. From what I understand, delaying to the end of a transaction is what you are probably after.



来源:https://stackoverflow.com/questions/2740098/sql-server-deleting-rows-with-foreign-key-constraints-can-transactions-overrid

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!