Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Проблема с триггером  [new]
Loginanton
Member

Откуда:
Сообщений: 11
Нужно создать триггер, который не позволяет добавить автомобиль с номером, который уже есть в парке. Таблица - auto(id int,number varchar(50),color varchar(50),mark varchar(50),pers_id int) Делаю так:
create trigger auto_insert on auto for insert as
if exists(select * from inserted where number in (select number from auto))
begin
raiserror('FATAL SYSTEM ERROR!!!',10,1)
rollback tran
begin tran
return
end
go
При этом какой бы я номер не задавал - срабатывает откат, авто не добавляет.Помогите пожалуйста исправить проблему.
16 май 11, 17:09    [10660027]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
Loginanton
Member

Откуда:
Сообщений: 11
СУБД: ms sql server 2008 R2
16 май 11, 17:11    [10660040]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Триггер for insert срабатывает после вставки, и записи на момент срабатывания триггера уже есть в таблице .
А ваша задача решается уникальными констрейнтами.

Сообщение было отредактировано: 16 май 11, 17:12
16 май 11, 17:12    [10660055]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
А еще у вас милое сообщение об ошибке.
16 май 11, 17:13    [10660060]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
Loginanton
Member

Откуда:
Сообщений: 11
Гавриленко Сергей Алексеевич, можно пример
16 май 11, 17:14    [10660065]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Loginanton
Гавриленко Сергей Алексеевич, можно пример
Пример чего?
16 май 11, 17:14    [10660075]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
raiserror('FATAL SYSTEM ERROR!!!',10,1)
[color=red]rollback tran[/color]
[color=red]begin tran[/color]
return

так набор оператор не лутше,чем сообщение об ошибке ;)
16 май 11, 17:15    [10660080]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
Loginanton
Member

Откуда:
Сообщений: 11
Гавриленко Сергей Алексеевич, пример тела триггера
16 май 11, 17:16    [10660085]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
iljy
Member

Откуда:
Сообщений: 8711
Loginanton,

http://msdn.microsoft.com/en-us/library/ms191166.aspx
16 май 11, 17:16    [10660087]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
Loginanton
Member

Откуда:
Сообщений: 11
а без модификации таблицы можно как то сделать?
16 май 11, 17:18    [10660108]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
iljy
Member

Откуда:
Сообщений: 8711
Loginanton,

без какой модификации?
16 май 11, 17:20    [10660127]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
Loginanton
При этом какой бы я номер не задавал - срабатывает откат, авто не добавляет.Помогите пожалуйста исправить проблему.
Потому что в таблице auto также имеется тот новый автомобиль (number), который вы только что добавли. При провере (exists) нужно исключить подобную ситуацию, т.е. проверять тот же наличие nubmer у другого автомобиля.

rollback разместите перед raiserror.

Зачем begin tran после rollback?
16 май 11, 17:25    [10660155]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Loginanton
а без модификации таблицы можно как то сделать?


alter trigger auto_insert on auto for insert as
if exists(select number from auto where number in (select number from inserted) GROUP BY number having count(*)>1)
begin
raiserror('FATAL SYSTEM ERROR!!!',10,1)
rollback tran
end

но я бы так не делал:)
16 май 11, 17:25    [10660156]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
WarAnt
но я бы так не делал:)
Я бы тоже.
16 май 11, 17:27    [10660168]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
Loginanton
Member

Откуда:
Сообщений: 11
Prolog
Зачем begin tran после rollback?
иначе The transaction ended in the trigger. The batch has been aborted
16 май 11, 17:29    [10660175]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Вообще, есть еще intead of insert триггер. По логике, возможность вставки надо проверять не после ее осуществления, а до.
Но констрейнт все равно лучше и правильнее.
16 май 11, 17:30    [10660185]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
Loginanton
иначе The transaction ended in the trigger. The batch has been aborted
И вы полагаете, что новый begin tran (кстати, а почему только один?) поможет вам избавиться от этого?
16 май 11, 17:34    [10660227]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
Loginanton
Member

Откуда:
Сообщений: 11
intead of insert триггер будет срабатывать вместо insert запроса, а хотелось бы чтоб триггер срабатывал до того, как запись добавиться в таблицу auto, но насколько я понял таких триггеров в ms sql нет
16 май 11, 17:34    [10660228]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
Loginanton
Member

Откуда:
Сообщений: 11
Prolog
И вы полагаете, что новый begin tran поможет вам избавиться от этого?
На этом же форуме подсказали именно так решать данную проблему
16 май 11, 17:35    [10660238]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Loginanton
intead of insert триггер будет срабатывать вместо insert запроса, а хотелось бы чтоб триггер срабатывал до того, как запись добавиться в таблицу auto, но насколько я понял таких триггеров в ms sql нет
А вы думаете, instead-триггер срабатывает после, что ли?
16 май 11, 17:36    [10660243]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Loginanton
Prolog
И вы полагаете, что новый begin tran поможет вам избавиться от этого?
На этом же форуме подсказали именно так решать данную проблему
Угу. Сами себе придумали проблему, теперь ее героически решаем.
16 май 11, 17:36    [10660249]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
Loginanton
Member

Откуда:
Сообщений: 11
Гавриленко Сергей Алексеевич
Loginanton
intead of insert триггер будет срабатывать вместо insert запроса, а хотелось бы чтоб триггер срабатывал до того, как запись добавиться в таблицу auto, но насколько я понял таких триггеров в ms sql нет
А вы думаете, instead-триггер срабатывает после, что ли?
нет, насколько я понимаю, триггер будет работать вместо insert запроса, замещая его
16 май 11, 17:38    [10660258]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
Совет. Создайте таблицу аналогияную auto. Создайте на ней after-триггер, потом удалите его и создайте instead of -триггер. Внути триггеров сделайте select-ты из вашей таблицы и таблицы inserted - до и после rollback'а. Поиграйте с вашей таблицей вставляя в неё записи. Практика великая вещь!
16 май 11, 17:41    [10660283]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
Loginanton
Member

Откуда:
Сообщений: 11
Prolog
Совет. Создайте таблицу аналогияную auto. Создайте на ней after-триггер, потом удалите его и создайте instead of -триггер. Внути триггеров сделайте select-ты из вашей таблицы и таблицы inserted - до и после rollback'а. Поиграйте с вашей таблицей вставляя в неё записи. Практика великая вещь!
Неуж нету более простого решения?
16 май 11, 17:42    [10660292]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Loginanton
Неуж нету более простого решения?
Забить. Можно еще ответы с самого начала почитать, но забить будет самым простым.
16 май 11, 17:43    [10660297]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить