通过使用中间条件从SQL Server数据库中删除行只删除一条记录(范围内的最后一条)
例如,我有一个带有这些记录的表日期。请参见屏幕截图: 此表的DLT列类型为bit bool,默认为0 false 我为这个表创建了一个Instead of delete触发器,当我删除一行时,它不会被真正删除,而是DLT列的值被更改为1 true通过使用中间条件从SQL Server数据库中删除行只删除一条记录(范围内的最后一条),sql,sql-server,Sql,Sql Server,例如,我有一个带有这些记录的表日期。请参见屏幕截图: 此表的DLT列类型为bit bool,默认为0 false 我为这个表创建了一个Instead of delete触发器,当我删除一行时,它不会被真正删除,而是DLT列的值被更改为1 true ALTER TRIGGER [dbo].[TrgDltDate] ON [dbo].[Date] INSTEAD OF DELETE AS BEGIN DECLARE @DeletedID INT SELECT @DeletedI
ALTER TRIGGER [dbo].[TrgDltDate]
ON [dbo].[Date]
INSTEAD OF DELETE
AS
BEGIN
DECLARE @DeletedID INT
SELECT @DeletedID = deleted.DateID
FROM deleted
UPDATE dbo.Date
SET DLT = 1, LastModificationDate = GETDATE()
WHERE DateID = @DeletedID
END
当我使用BETWEEN condition for delete将DLT列值更改为1某些记录时,只需删除将DLT列值更改为1范围内的最后一条记录,例如:
DELETE FROM dbo.Date
WHERE DateID BETWEEN 2 AND 6
它只是删除了将DateID=6的记录的DLT列值更改为1
但是,当我禁用该触发器而不是删除时,两者之间的关系正常工作。怎么了?tnx.您的触发器仅更改一行。在SQL Server中,触发器是集合操作,因此您应该将其视为集合:
ALTER TRIGGER [dbo].[TrgDltDate] ON [dbo].[Date] INSTEAD OF DELETE
AS
BEGIN
UPDATE dbo.Date
SET DLT = 1,
LastModificationDate = GETDATE()
WHERE DateID IN (SELECT d.DateID FROM Deleted d)
END;
也就是说,所有被删除的行都被传递到触发器中,并进入已删除的表(实际上是一个伪表)。您希望删除所有的id,而不是一个,因此无法将id存储在变量中。yesss。它工作正常。有很多兄弟。还有一个问题,从已删除的d中选择d.DateID中的d是什么?@mohamdJ.A。这是一个表别名。在这种情况下,这不是严格需要的,但这是一个很好的做法。我明白了。又是tnx