【发布时间】:2015-01-07 21:12:39
【问题描述】:
如何在不使用大量变量的情况下重写此更新触发器?
我编写了我的第一个 SQL Server 触发器,它工作正常,但我认为,必须有一个更简单的解决方案。
如果 5 列中的至少一个被更改,我会在另一个表中写入两个新行。 第 1 行 = old Fahrer (=Driver) 和 old dispodate 和 update-time 第 2 行 = 新的 Fahrer 和新的 dispodate 和 updatedatetime 我的解决方案只是一个foxpro-trigger的副本,但是在T-SQL中必须有一个更简单的解决方案来检查一个列是否被更改。
ALTER TRIGGER [dbo].[MyTrigger]
ON [dbo].[tbldisposaetze]
AFTER UPDATE
AS
SET NOCOUNT ON;
/*SET XACT_ABORT ON
SET ARITHABORT ON
*/
DECLARE @oldfahrer varchar(10)
DECLARE @oldbus varchar(10)
DECLARE @olddispodat date
DECLARE @oldvzeit decimal(4,0)
DECLARE @oldbzeit decimal(4,0)
DECLARE @oldbeschreibk varchar(255)
DECLARE @newfahrer varchar(10)
DECLARE @newbus varchar(10)
DECLARE @newdispodat date
DECLARE @newvzeit decimal(4,0)
DECLARE @newbzeit decimal(4,0)
DECLARE @newbeschreibk varchar(255)
SELECT @oldfahrer = fahrer,@oldbeschreibk=beschreibk,@oldbus=bus,@oldbzeit=bzeit,@olddispodat=dispodat,@oldvzeit=vzeit
FROM DELETED D
SELECT @newfahrer = fahrer,@newbeschreibk=beschreibk,@newbus=bus,@newbzeit=bzeit,@newdispodat=dispodat,@newvzeit=vzeit
FROM inserted I
if @oldbeschreibk <> @newbeschreibk or @oldbus <> @newbus or @oldbzeit <> @newbzeit or @oldfahrer <> @newfahrer or @oldvzeit <> @newvzeit
begin
IF (SELECT COUNT(*) FROM tbldispofahrer where fahrer=@oldfahrer and dispodat=@olddispodat) > 0
update tbldispofahrer set laenderung = GETDATE() where fahrer=@oldfahrer and dispodat=@olddispodat
else
INSERT into tbldispofahrer (fahrer,dispodat,laenderung) VALUES (@oldfahrer,@olddispodat,getdate())
IF (SELECT COUNT(*) FROM tbldispofahrer where fahrer=@newfahrer and dispodat=@newdispodat) > 0
update tbldispofahrer set laenderung = GETDATE() where fahrer=@newfahrer and dispodat=@newdispodat
else
INSERT into tbldispofahrer (fahrer,dispodat,laenderung) VALUES (@newfahrer,@newdispodat,getdate())
end
【问题讨论】:
-
好的,首先你不应该使用这样的变量!永远在任何触发器。删除和插入的表可以包含多条记录,您必须编写代码来考虑这一点。
-
您的触发器有 MAJOR 缺陷,因为您似乎认为它会每行调用一次 - 那是不是 b> 情况。触发器将每个语句触发一次,因此如果您的
UPDATE语句影响了 25 行,您将触发触发器一次,然后Inserted和@987654324 @ 每个将包含 25 行。您的SELECT代码将选择这 25 行中的哪一行?它是不确定的。您需要重写触发器以考虑到这一点! -
tbldispofahrer表中的主键列是什么。
标签: sql sql-server tsql triggers