TRIGGER中的Simple IF EXISTS失败



我创建了一个简单的触发器:

ALTER TRIGGER [dbo].[SprawdzZajetosc] ON [dbo].[Wypozyczenia]
FOR insert, update
AS
BEGIN
IF EXISTS (SELECT * FROM Wypozyczenia)
BEGIN
RAISERROR('Wybrany pojazd został już wypożyczony w wybranym przedziale czasu.', 16, 1)
ROLLBACK TRANSACTION
END
END

我不明白为什么即使表"Wypozyczenia"为空,"if"也会返回给我TRUE?"Wypozyczenia"包含什么并不重要,它总是返回给我TRUE

我尝试使用count(*),它总是返回一个大于0的值。

为什么?

我不能100%确定这一点,但这听起来很合乎逻辑——触发器是一个插入/更新触发器。一旦插入某个内容,就会触发触发器,并且条件为TRUE。由于触发了ROLLBACK TRANSACTION,插入的行随后被回滚,因此得到一个空表。你到底想在这里实现什么?

除了您这样做的原因外,在您的情况下IF EXISTS()始终为TRUE的原因很简单这是因为您使用了AFTERFOR触发器。

CREATE TRIGGER
AFTER指定仅当触发SQL语句中指定的所有操作都已成功执行时,才触发DML触发器。所有引用级联操作和约束检查也必须在触发之前成功。

表示您试图插入的行已在表中。这只是一个尚未提交的事务。

这是SQLFiddle演示


您的IF EXISTS()检查可能只在INSTEAD OF INSERT触发器中起作用,但您应该考虑到SQL Server中的触发器是基于语句的。这意味着它每个语句触发一次,并且您可以在一个语句中插入多行。

这是SQLFiddle演示


就触发器定义中的FOR UPDATE子句而言,它根本没有任何意义。如果您正在更新某个内容,它应该在表中。因此,表不是空的。

相关内容

最新更新