2014-05-05 36 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