【发布时间】:2017-07-07 10:23:00
【问题描述】:
我有一张这样的桌子:
---------------table1--------------------------------------------
id | name | lname | displayStatus | delStatus
1 a b 1 0
2 aa bb 0 0
3 aaa bbb 1 0
4 aaaa bbbb 0 1
---------------tbl_LOG--------------------------------------------
id | rowData| actType
我有这个更新触发器:
alter trigger tgr_delete
on table1
after update
as
begin
declare @rowData nvarchar(max), @username nvarchar(50)
if update(delStatus)
begin
if((select delStatus from inserted) = 1)
begin
set @rowData = (select CAST((CAST(id as nvarchar(12)) + ' | ' + name) as nvarchar(max)) from inserted)
exec sp_insert_LOG 'table1', @rowData, 2
end
else if((select delStatus from inserted) = 0)
begin
set @rowData = (select CAST((CAST(id as nvarchar(12)) + ' | ' + name) as nvarchar(max)) from inserted)
exec sp_insert_LOG 'table1', @rowData, 3
end
end
else if update(displayStatus)
begin
if((delStatus = 0 or delStatus is null) and (select displayStatus from inserted) = 0)
begin
set @rowData = (select CAST((CAST(id as nvarchar(12)) + ' | ' + name) as nvarchar(max)) from inserted)
exec sp_insert_LOG 'table1', @rowData, 4
end
else if((delStatus = 0 or delStatus is null) and (select displayStatus from inserted) = 1)
begin
set @rowData = (select CAST((CAST(id as nvarchar(12)) + ' | ' + name) as nvarchar(max)) from inserted)
exec sp_insert_LOG 'table1', @rowData, 5
end
end
end
我有 3 个存储过程
- 首先是更新delStatus
- 第二个是更新显示状态
- 第三个是更新所有列
现在我应该怎么做才能避免干扰前两个条件。
【问题讨论】:
-
只是检查我是否理解这个问题 - 您希望触发器仅在
delStatus或displayStatus更改时才起作用,但如果它们一起更改或任何其他列也更改则不会? -
是的。我想要这个。
-
sql 中的触发器按语句工作,而不是按行工作。如果您曾经在 table1 上运行多行更新语句,它将失败。可以通过使用主键上的内部连接比较删除和插入之间的值来检查哪些列已更改(在这种情况下假设为 id)。
标签: sql sql-server triggers sql-server-2016