2016-03-31 5 views
0

Я просто пытался выяснить, как сделать основной триггер, когда я обновил подрядSQL триггер для обновления

Heres установки

CREATE TABLE marriage(
personid int 
married varchar(20) 
); 

INSERT INTO marriage 
values (1, unmarried); 

Что им пытаются сделать, это создать триггер SQL, который сделают так, что, когда я обновляю, человек может переходить только от замужних к разведенным, но не неженатым, чтобы развестись.

Если кто-то может помочь мне с структурирование это было бы здорово

+2

Обновление таблицы с помощью хранимой процедуры. И сделайте операции внутри этой процедуры. Может быть, вам не нужно писать триггер? – osmanraifgunes

+0

Осторожно с этим. Вы можете начать «святую войну». Некоторые из них рассмотрят эту бизнес-логику и заявят, что у нее нет бизнеса в вашей системе хранения. Другие не видят никаких проблем с этим подходом. Но в любом случае, о чем подумать. –

+0

Как обновляется ваша таблица? –

ответ

0

Это то, что я искал, если кто-то ищет что-то подобное

alter trigger 
trigtest3 
on married 
for update 
as 
begin 
    declare @old varchar(20) 
    declare @new varchar(20) 

    select @old = married from deleted 
    select @new = married from inserted 
    if(@old like 'Unmarried' AND @new like 'Divorced') 
     rollback 
end 
+0

Эти решения будут работать только для одной записи, если обновлены несколько записей, вы получите только одну строку. Это не задано – JVM

+1

Возможно, вы захотите добавить «RaIsError» или «Throw» при откате. Не могли бы вы получить ошибку, например: «Невозможно изменить« Семейный статус »от« неженатого »до« разведенного ». а не общий вкладыш booboo? – HABO

0

SQL Server не обеспечивает за строкой к сожалению, триггеры, но только триггеры для полной команды. И одна команда обновления может обновлять несколько строк, поэтому вы должны проверить, претерпело ли по крайней мере одну затронутую строку запрещенное изменение. Вы делаете это, присоединяя псевдоним таблицы deleted и inserted к столбцу или комбинации столбцов, которые однозначно идентифицируют запись (т. Е. Первичный ключ).

create trigger trg_upd_married on marriage for update as 
begin 
    declare @error_count int 

    select @error_count = count(*) 
    from deleted d 
    join inserted i on i.id = d.id 
    where d.married = 'Unmarried' 
    where i.married = 'Divorced' 

    if @error_count > 0 
    begin 
    raiserror('Unmarried persons cannot get divorced.', 16, 121) 
    rollback transaction 
    end 
end; 

Вышеуказанный триггер может по-прежнему иметь ошибки. Я не владею TSQL (и просто замечаю, что я нахожу его триггеры довольно неуклюжими - по крайней мере, по сравнению с триггерами Oracle, к которым я привык).

0

Вам необходимо использовать вместо триггеров, как вам нужно, чтобы предотвратить обновление. Триггеры обновления запускаются после вставки. Используйте следующий код -

create trigger abc on marriage 
for instead of update 
as 
begin 
Begin transaction 
if exists(select 1 from deleted as a 
inner join inserted as b 
on a.personid = b.personid 
where a.married = 'unmarried' and b.married = 'Divorced') 
begin 
raiserror('Status can not be changed from unmarried to Divorced',16,1) 
Rollback transaction 
end 
else 
begin 
update a 
set a.married = b.married 
from marriage as a 
inner join inserted as b 
on a.personid = b.personid 
Commit transaction 
end 
end 

Позвольте мне знать, если это помогает

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