2014-09-23 3 views
0

Я хочу создать триггер, который не выполняет вставку, если в таблице уже существует вставка для столбца 2, а значение для столбца 1 в таблице отличается от значения, введенного для столбца 1 . Я сделалтриггер с условием выбора

create trigger tr1 
on dbo.table 
after insert, update 
as 
begin 
    declare @col1 varchar(20) 
    declare @col2 varchar(20) 

if ( 
    exists(
    select column2 from table 
    where column2='@col2' 
     ) 
    and @col1 <> select column1 from table 
    where column2='@col2' 
    ) 
begin 
    RAISERROR('Error', 16, 1); 
    ROLLBACK 
end 
end 
+1

Посмотрите на 'ВМЕСТО OF' вставки триггеров. Вот хороший пример http://stackoverflow.com/questions/15372794/simple-t-sql-instead-of-trigger – adrianm

ответ

0

Я не уверен, что я понял, что вы tryng сделать, но простой способ проверить существующие значения с триггерами является использование таблицы транзакций.

  • вставляется для UPDATE и INSERT
  • делецией УДАЛИТЬ

1.

create table some_table(col1 int , col2 int) 
go 

2.

create trigger tr1 on dbo.some_table after insert, update 
as 
begin 
    declare @cnt int 

    select 
     @cnt = count(*) 
    from some_table as t 
    inner join inserted as i on t.col1 = i.col1 and t.col2 = i.col2 

    if isnull(@cnt,0) > 1 
    begin 
     RAISERROR('Error', 16, 1); 

     ROLLBACK 
    end 
end 

3.

insert into some_table(col1, col2) values(1,2) 
go 
insert into some_table(col1, col2) values(2,3) 
go 
--HERE the trigger will crash 
insert into some_table(col1, col2) values(1,2) 
go 

Я лично предпочитаю UNIQUE INDEX подход :)

+0

Большое спасибо за то, что так дидактически объясняю: D –

Смежные вопросы