2014-01-12 49 views
0

我创建了一个简单的触发器:简单,如果存在触发失败

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”是空的“如果”将返回我TRUE?无论什么'Wypozyczenia'包含无所谓 - 它总是让我回到TRUE

我试着用count(*)它总是返回我的值> 0

这是为什么?

回答

1

我不是100%确定这一点,但这听起来符合逻辑 - 触发器是插入/更新触发器。一旦插入了某个东西,触发器就会被触发并且条件为TRUE。由于有一个ROLLBACK TRANSACTION被触发,插入的行会被回滚,因此你会得到一个空表。你究竟想在这里实现什么?

1

除了你为什么这样做的原因,IF EXISTS()事业总是TRUE你的情况是很简单那是因为你使用的是AFTERFOR触发。

CREATE TRIGGER
AFTER指定只当在触发SQL语句中指定所有操作 成功执行DML触发器触发。 所有引用级联操作和约束检查也必须在此触发器触发前成功执行 。

意味着您试图插入的行已经在表中。这只是一个交易尚未完成。

这里是SQLFiddle演示


IF EXISTS()检查可能已经在INSTEAD OF INSERT触发只有工作,但那么你应该已经考虑到在SQL Server触发器是基于声明。这意味着每个语句触发一次,并且您可以在一个语句中插入多行。

这里是SQLFiddle演示


至于FOR UPDATE条款去你的触发器定义它没有任何意义可言。如果你正在更新它应该在表中。因此表格不是空的。