我有一个包含大约 50 列的表(子),其中大约 30 列在另一个表(父)中将一列作为 Id 引用。我希望当我更新 Id 时,子表中具有父值的所有列也将更新,并且当我从父表中删除行时,子表中的行设置为空。我的问题是如何从具有期望值的子表中获取列并更新它们。我看到了这个 和这个, 但我不知道如何将它们用于触发器。最简单/最好的方法是什么?
问问题
564 次
2 回答
1
您可能想看看FOREIGN KEY Constraints
外键 (FK) 是用于在两个表中的数据之间建立和强制链接的列或列组合。您可以通过在创建或修改表时定义 FOREIGN KEY 约束来创建外键。
在外键引用中,当保存一个表的主键值的一个或多个列被另一个表中的一个或多个列引用时,将在两个表之间创建一个链接。此列成为第二个表中的外键。
还可以查看创建和修改 FOREIGN KEY Constraints和SQL FOREIGN KEY Constraint
另请查看级联参照完整性约束
通过使用级联参照完整性约束,您可以定义当用户尝试删除或更新现有外键指向的键时 SQL Server 执行的操作。
于 2013-08-15T07:52:18.150 回答
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
于 2013-08-16T20:46:58.770 回答