在SQL Server 2008中是否有查询将删除所有从属表中的数据以及所选表?删除从属表中的数据
我对没有详细阐述这个问题深表歉意。我知道级联删除工作正常,但我的应用程序连接到第三方SQL Server数据库。我有几个单元测试插入目标表和从属表。不幸的是,目标表上的约束不是在删除级联,我不能创建它们或创建它们。我正在寻找遍历依赖关系的通用方法,并以正确的顺序删除数据。
在SQL Server 2008中是否有查询将删除所有从属表中的数据以及所选表?删除从属表中的数据
我对没有详细阐述这个问题深表歉意。我知道级联删除工作正常,但我的应用程序连接到第三方SQL Server数据库。我有几个单元测试插入目标表和从属表。不幸的是,目标表上的约束不是在删除级联,我不能创建它们或创建它们。我正在寻找遍历依赖关系的通用方法,并以正确的顺序删除数据。
由于有是外键关系,下面的脚本可以让你开始模仿级联删除。
DECLARE @TableName VARCHAR(32)
DECLARE @PrimaryKey VARCHAR(32)
SET @TableName = 'MasterTable'
SET @PrimaryKey = '1'
SELECT 'DELETE FROM '
+ fks.name + '.' + fkt.name
+ ' WHERE '
+ pc.name
+ ' = '
+ @PrimaryKey
, fko.name as [FK Name]
, fk.constraint_column_id as [Col Order]
, fks.name + '.' + fkt.name as [FK table]
, pc.name as [FK column]
, rcs.name + '.' + rct.name as [PK table]
, rc.name as [PK column]
FROM sys.foreign_key_columns fk
-- FK columns
INNER JOIN sys.columns pc ON fk.parent_object_id = pc.object_id
AND fk.parent_column_id = pc.column_id
INNER JOIN sys.objects fkt ON pc.object_id = fkt.object_id
INNER JOIN sys.schemas as fks ON fks.schema_id = fkt.schema_id
-- referenced PK columns
INNER JOIN sys.columns rc ON fk.referenced_object_id = rc.object_id
AND fk.referenced_column_id = rc.column_id
INNER JOIN sys.objects rct ON rc.object_id = rct.object_id
INNER JOIN sys.schemas as rcs ON rcs.schema_id = rct.schema_id
-- foreign key constraint name
INNER JOIN sys.objects fko ON fk.constraint_object_id = fko.object_id
WHERE rct.Name = @TableName
阅读关于msdn,书籍和文章的ON CASCADE DELETE
,你会找到答案。
要做到这一点,你有级联删除设置表之间的约束。你可以做一个图中通过拖动字段之间的连接和编辑的属性,或使用查询:
alter table SomeTable
add constraint SomeConstraint
foreign key (SomeField) references SomeOtherTable (SomeOtherField)
on delete cascade
如果您具有带级联删除规则的完整性约束(外键),则不必担心。 http://publib.boulder.ibm.com/infocenter/idshelp/v10/topic/com.ibm.sqls.doc/sqls292.htm – AlexanderMP 2010-09-20 11:03:12
尽管链接是用于informix文档,但对于sql server也是如此。 – Giorgi 2010-09-20 11:05:28
如果至少有外键已定义(没有级联删除),则可以使用系统表创建动态SQL,实际上与级联删除相同。如果没有定义外键,那么为它制定通用解决方案几乎没有希望。 – 2010-09-20 14:18:50