2014-05-05 39 views
1

晚上好。SQL:重複觸發信息3609

我有任務創建觸發器將由

insert into tbl(row1, row2) 
values('val1', 'val2') 

比較插入的記錄所以我寫了:

CREATE TRIGGER duplikat_miejsce ON miejsce 
AFTER INSERT 
AS 
if exists (select * from miejsce i 
    inner join inserted t on i.ulica=t.ulica and i.numer=t.numer and i.miasto=t.miasto and i.kod=t.kod) 
begin 
    RAISERROR ('Adres juz istnieje',1,2) 
    rollback 
end 
go 

觸發本身造成的。但它不能正常工作。它提供的消息:

住址一卷istnieje
消息50000,級別1,狀態2
消息3609,級別16,狀態1,行
在觸發器中結束交易。該批次已被中止。

什麼是最重要的,它給出了錯誤,當我不復制任何列的任何列。它否認插入任何記錄我使用的表「miejsce」

Insert命令的嘗試:

insert into miejsce(id_miejsce, ulica, numer, miasto, kod, telefon, uwagi) 
values (6, 'Widmowa', '14', 'Warszawka', '88-800', null, null) 
+0

好吧,觸發器是'AFTER INSERT',這意味着它在**插入後執行**。所以,當觸發器執行時,你的'IF EXISTS'將總是返回true – Lamak

回答

0

您已經創建了一個AFTER觸發器,它在對數據庫進行更改時觸發。您需要創建一個「而不是」觸發器,以便在提交到磁盤之前可以回滾任何無效操作。

事情是這樣的......

CREATE TRIGGER duplikat_miejsce ON miejsce 
INSTEAD OF INSERT 
AS 
BEGIN 
IF EXISTS (select * from miejsce i 
      inner join inserted t 
      on i.ulica = t.ulica 
      and i.numer = t.numer 
      and i.miasto = t.miasto 
      and i.kod = t.kod) 
    BEGIN 
    RAISERROR ('Adres juz istnieje',16,1) 
    END 
ELSE 
    BEGIN 

    INSERT INTO miejsce (id_miejsce, ulica, numer, miasto, kod, telefon, uwagi) 
    SELECT t.id_miejsce, t.ulica, t.numer, t.miasto, t.kod, t.telefon, t.uwagi 
    FROM inserted t 
    WHERE NOT EXISTS (select 1 
        from miejsce i 
        WHERE i.ulica = t.ulica 
        and i.numer = t.numer 
        and i.miasto = t.miasto 
        and i.kod = t.kod) 
    END 


END 

如果你想提高的錯誤,錯誤嚴重級別必須高於10,因爲根據嚴重級別11的錯誤被認爲是交戰的消息不是錯誤。

+0

在那裏做什麼「ROLLBACK」? – Lamak

+0

因爲我更新了OP的現有代碼,所以乾杯只是把它留在了那裏。 –

+0

非常感謝! – user3605798

0

新插入的行已經在表中時,檢查觸發內做出。這裏有一個簡單的示例來演示它:

create table t (i int, j int); 
go 
insert t values (1,1); 
go 

create trigger tr 
on t 
after insert 
as 
select * from t; 
if exists(select * from t inner join inserted i on t.i = i.i and t.j = i.j) 
begin 
    raiserror ('Adres juz istnieje',1,2); 
    rollback; 
end 
go 

insert t values(2,2) 
go 

drop table t 
go 

如果你有一個合適的主鍵,在where子句中使用它。

+0

感謝你展示「AFTER INSERT」的工作原理。現在我知道我爲什麼不工作。我通過在這裏給其他人提出的問題給出瞭解決任務的「想法」。 – user3605798