触发删除,更新表时有许多引用一列的列

时间:2013-08-15 07:49:41

标签: sql-server database triggers

我有一个包含约50列的表(子),其中约30列引用一列作为另一个表(父)中的Id。 我希望当我更新Id时,子表中具有父值的所有列也将更新,当我从父表中删除行时,在子表中设置null。 我的问题是如何从子表中获取具有期望值的列并更新它们。 我看到thisthis one 但我不知道如何将它们用于触发器。 什么是最简单/最好的方法呢?

2 个答案:

答案 0 :(得分:1)

您可能需要查看FOREIGN KEY Constraints

  

外键(FK)是使用的列或列组合   建立并强制执行两个表中的数据之间的链接。您   您可以通过定义FOREIGN KEY约束来创建外键   创建或修改表格。

     

在外键引用中,在两个表之间创建链接   包含一个表的主键值的一列或多列   由另一个表中的一列或多列引用。这一栏   成为第二个表中的外键。

另请查看Creating and Modifying FOREIGN KEY ConstraintsSQL FOREIGN KEY Constraint

另请参阅Cascading Referential Integrity Constraints

  

通过使用级联参照完整性约束,您可以定义   SQL Server在用户尝试删除时执行的操作   更新现有外键指向的键。

答案 1 :(得分:0)

我终于找到了解决方案:

Create TRIGGER [dbo].[DeleteUser]

ON dbo.ParentTable

INSTEAD OF DELETE

AS 

BEGIN

    SET NOCOUNT ON;

 declare @Search varchar(200)

 select @Search=d.Id from deleted as d   

Declare @tablevar table(Id  nvarchar(200),ColName  nvarchar(200))

--FindStringAndReturnCols return the name of columns And Id's of rows that have value

insert into @tablevar(Id,ColName) exec FindStringAndReturnCols @Search

declare @Id nvarchar(200), @ColName nvarchar(200),@SqlQuery as nvarchar(max)

Declare c Cursor For Select Id,ColName From @tablevar

Open c

Fetch  c into @Id,@ColName


While @@Fetch_Status=0

 Begin

 set  @SqlQuery=''

 set @SqlQuery= 'update ChildTable set '+ @ColName +' = null where Id like N''%'+@Id+'%'''

   exec (@SqlQuery)

   Fetch  c into @Id,@ColName
End

delete from Parent where Id=@Search

Close c

Deallocate c

END