以下是我的触发器:
ALTER TRIGGER [dbo].[trgPaxeDeleted]
ON [dbo].[paxe]
AFTER DELETE
AS
declare
@HFflightID int,
@RFflightID int
BEGIN
Select @HFflightID = hfFlightID, @RFflightID = rfFlightID from deleted
-- Hinflug: flugKontingent hochsetzen --
UPDATE flightdata
SET flightQuota = flightQuota + 1
WHERE (flightID = @HFflightID)
-- Rückflug: flugKontingent hochsetzen --
UPDATE flightdata
SET flightQuota = flightQuota + 1
WHERE (flightID = @RFflightID)
END
这适用于删除单行。但是当删除多行时,只完成一次触发操作。
如何更改此内容?
答案 0 :(得分:10)
SQL Server触发为所有行触发一个触发器实例; deleted
表将包含所有正在更新的行,因此您无法将单个实例存储在变量中。
删除以下代码行:
Select @HFflightID = hfFlightID, @RFflightID = rfFlightID from deleted
您的更新语句应如下所示:
UPDATE flightdata
SET flightQuota = flightQuota + 1
WHERE flightID IN (SELECT hfFlightID FROM deleted)
UPDATE flightdata
SET flightQuota = flightQuota + 1
WHERE flightID IN (SELECT rfFlightID FROM deleted)
答案 1 :(得分:1)
您可以删除多行。但你必须放多个id。例如:
DELETE FROM VisitorMaster WHERE Id=85 or Id=86
答案 2 :(得分:1)
我以此为例,并使用主键
进行删除CREATE TRIGGER On_Delete
ON tblActivityArchive AFTER DELETE
AS BEGIN
DELETE dbo.tblJobLinesArchive
FROM dbo.tblJobLinesArchive a
INNER JOIN Deleted d ON a.ActivityRef = d.ActivityRef
END
http://www.sqlservercentral.com/Forums/Topic484314-338-1.aspx
答案 3 :(得分:0)
删除触发器更改为
ALTER TRIGGER [dbo].[trgPaxeDeleted]
ON [dbo].[paxe]
AFTER DELETE
AS
declare
@HFflightID int,
@RFflightID int
BEGIN
SET NOCOUNT ON;
UPDATE flightdata
SET flightQuota = flightQuota + 1
WHERE flightID IN (SELECT hfFlightID FROM deleted)
UPDATE flightdata
SET flightQuota = flightQuota + 1
WHERE flightID IN (SELECT rfFlightID FROM deleted)
END
答案 4 :(得分:0)
我遇到了同样的问题,并且找到了一个简单的解决方案。
首先,我创建了触发器表来存储已删除的列
CREATE TABLE dbo.XLogs (
Field1 varchar(30),
Field2 varchar(30),
Field3 varchar(30),
Field4 varchar(30),
Field5 varchar(2)
);
然后我创建了触发器
CREATE TRIGGER dbo.TXLogs ON dbo.Table
AFTER DELETE
AS
BEGIN
DECLARE @Id varchar(30)
DECLARE @Field1 varchar(30)
DECLARE @Field2 varchar(30)
DECLARE @Field4 varchar(30)
SELECT Id,Field1,Field2 INTO #DeletedTempTable FROM deleted
WHILE(EXISTS(SELECT Id,Field1,Field2 FROM #DeletedTempTable))
BEGIN
SET @Field4 = 'Delete Row'
SELECT TOP 1 @Id =Id , @Field1 = Field1, @Field2 = Field2 FROM #DeletedTempTable
INSERT INTO dbo.XLogs VALUES (@Id,@Field1,@Field2,@Field4,'0')
DELETE FROM #DeletedTempTable WHERE Id = @Id
END
END
我创建了临时表来存储我的初始结果,然后使用while循环遍历它们。
在删除循环行之前,我选择了TOP 1仅列出一行,读取数据并将其存储在日志表中,然后再次循环以获取下一行。相同的逻辑可用于更新的行,只需将FROM删除项更改为FROM插入的行和其他行等