我有一个包含约50列的表(子),其中约30列引用一列作为另一个表(父)中的Id。 我希望当我更新Id时,子表中具有父值的所有列也将更新,当我从父表中删除行时,在子表中设置null。 我的问题是如何从子表中获取具有期望值的列并更新它们。 我看到this 和this one 但我不知道如何将它们用于触发器。 什么是最简单/最好的方法呢?
答案 0 :(得分:1)
您可能需要查看FOREIGN KEY Constraints
外键(FK)是使用的列或列组合 建立并强制执行两个表中的数据之间的链接。您 您可以通过定义FOREIGN KEY约束来创建外键 创建或修改表格。
在外键引用中,在两个表之间创建链接 包含一个表的主键值的一列或多列 由另一个表中的一列或多列引用。这一栏 成为第二个表中的外键。
另请查看Creating and Modifying FOREIGN KEY Constraints和SQL 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