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

Откуда:
Сообщений: 135
Уважаемые коллеги,
помогите разобраться с ситуацией ... есть таблица "Некий бюджет" с котором может быть несколько сценариев ... сценарии создает сам пользователь на основе уже имеющегося ... создание сценария происходит в хр.проц.:
insert into Expense 
(
	   [idContr]
      ,[idExp3L]
      ,[NameExp3L]
      ,[SumBDR]
      ,[SumBDPS]
      ,[ExpMonth]
      ,[ExpYear]
      ,[idDocExp]
      ,[idScenExp]
      ,[ExpApprovedScen]
      ,[ItemExp],[ScenNameExp]
)
select 
[idContr]
      ,[idExp3L]
      ,[NameExp3L]
      ,[SumBDR]
      ,[SumBDPS]
      ,[ExpMonth]
      ,[ExpYear]
      ,[idDocExp]
      ,5--@result
      ,0
      ,[ItemExp],null
from Expense where idDocExp=1 and idScenExp=@idScenExp_ and ExpYear=@year_

... а на таблице есть триггер, который контролирует введение дублей записей по нескольким, перечисленным в триггере полям ...
триггер:
ALTER TRIGGER [dbo].[tr1]
   ON  [Budget].[dbo].[Expense] 
  for INSERT--,UPDATE --,DELETE >
AS 
BEGIN

select		Expense.[idContr]
			,Expense.[idExp3L]
			,Expense.[ExpMonth]
			,Expense.[ExpYear]
			,Expense.[idDocExp]
			,Expense.[idScenExp]
FROM Expense inner join Inserted  
on			Expense.idContr=Inserted.idContr
			and Expense.idExp3L=Inserted.idExp3L	
			and Expense.ExpMonth=Inserted.ExpMonth
			and Expense.ExpYear=Inserted.ExpYear
			and Expense.idDocExp=Inserted.idDocExp
			and Expense.idScenExp=Inserted.idScenExp
			and Expense.ExpApprovedScen=Inserted.ExpApprovedScen

if @@rowcount>1
begin
	rollback transaction
	raiserror('Вы допустили полное дублирование расхода на Контрагента!',14,1)
end
END

в приведенном коде хр.проц. я даже принудительно задал значения для поля [idScenExp]=5 (там передается параметр из приложения) и точно известно, что сценария= 5 в таблице нет ... и тем не менее триггер откатывает транзакцию ...
подскажите, пожалуйста, в чем у меня косяк ...
17 дек 15, 13:50    [18572976]     Ответить | Цитировать Сообщить модератору
 Re: непонятно, почему отрабатывает триггер ...  [new]
Glory
Member

Откуда:
Сообщений: 104760
SerRock
точно известно, что сценария= 5 в таблице нет ... и тем не менее триггер откатывает транзакцию ...
подскажите, пожалуйста, в чем у меня косяк ...

Триггер for INSERT срабатывает _после_ занесения данных в таблицу
Поэтому сценарий= 5 в таблице уже будет 100%
17 дек 15, 13:56    [18573028]     Ответить | Цитировать Сообщить модератору
 Re: непонятно, почему отрабатывает триггер ...  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
SerRock,

этот триггер запускается ПОСЛЕ вставки.
К этому моменту все записи, перечисленные в inserted УЖЕ вставлены в таблицу.
Поэтому @@ROWCOUNT всегда больше 0, если вставляется хотя бы одна запись.
Уж лучше в таком случае INSTEAD INSERT триггер сделать.
Вместо проверки @@ROWCOUNT лучше использовать EXISTS()
17 дек 15, 13:56    [18573037]     Ответить | Цитировать Сообщить модератору
 Re: непонятно, почему отрабатывает триггер ...  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
iap
SerRock,

этот триггер запускается ПОСЛЕ вставки.
К этому моменту все записи, перечисленные в inserted УЖЕ вставлены в таблицу.
Поэтому @@ROWCOUNT всегда больше 0, если вставляется хотя бы одна запись.
Уж лучше в таком случае INSTEAD INSERT триггер сделать.
Вместо проверки @@ROWCOUNT лучше использовать EXISTS()
INSTEAD OF INSERT триггер, я хотел сказать.
17 дек 15, 13:57    [18573047]     Ответить | Цитировать Сообщить модератору
 Re: непонятно, почему отрабатывает триггер ...  [new]
Владислав Колосов
Member

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

аццкий тригер - во - первых, запрос с результатом в никуда, а триггер не должен возвращать датасеты, во-вторых rollback.

Почему не работает? Потому, что запрос вернет записи даже если в них нет дублей. И ещё - Вы не знаете, в какой момент срабатывает триггер, а гадания и предположения не могут дать хороший код.
17 дек 15, 13:59    [18573075]     Ответить | Цитировать Сообщить модератору
 Re: непонятно, почему отрабатывает триггер ...  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Что автору помешало написать проверку в процедуре - также не ясно...
17 дек 15, 14:01    [18573084]     Ответить | Цитировать Сообщить модератору
 Re: непонятно, почему отрабатывает триггер ...  [new]
SerRock
Member

Откуда:
Сообщений: 135
спасибо ... ну, да ,действительно ... уже же прошла вставка ... попробую insted of ...
17 дек 15, 14:14    [18573166]     Ответить | Цитировать Сообщить модератору
 Re: непонятно, почему отрабатывает триггер ...  [new]
SerRock
Member

Откуда:
Сообщений: 135
Владислав Колосов,
спасибо за совет ... триггер в принципе для другого - пользователь может ведь и руками ввести данные ...
17 дек 15, 14:15    [18573172]     Ответить | Цитировать Сообщить модератору
 Re: непонятно, почему отрабатывает триггер ...  [new]
Glory
Member

Откуда:
Сообщений: 104760
SerRock
триггер в принципе для другого - пользователь может ведь и руками ввести данные ...

Поэтому для 100%ой гарантии уникальность обеспечивают через uqnique contraint, не через триггера
17 дек 15, 14:17    [18573178]     Ответить | Цитировать Сообщить модератору
 Re: непонятно, почему отрабатывает триггер ...  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
SerRock
Владислав Колосов,
спасибо за совет ... триггер в принципе для другого - пользователь может ведь и руками ввести данные ...
со студии ??? У вас юзеря имеют прямые грантиы на таблицы ????? Абзац
17 дек 15, 14:18    [18573179]     Ответить | Цитировать Сообщить модератору
 Re: непонятно, почему отрабатывает триггер ...  [new]
SerRock
Member

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

да, нет ... приложение старое ... еще в аксе написаное ... там да - прямой доступ к табл. ...
17 дек 15, 14:23    [18573201]     Ответить | Цитировать Сообщить модератору
 Re: непонятно, почему отрабатывает триггер ...  [new]
SerRock
Member

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

вы имеете ввиду составной ключ ..?
17 дек 15, 14:24    [18573211]     Ответить | Цитировать Сообщить модератору
 Re: непонятно, почему отрабатывает триггер ...  [new]
Glory
Member

Откуда:
Сообщений: 104760
SerRock
вы имеете ввиду составной ключ ..?

unique constraint
17 дек 15, 14:27    [18573219]     Ответить | Цитировать Сообщить модератору
 Re: непонятно, почему отрабатывает триггер ...  [new]
SerRock
Member

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

да, добрая мысль ... а на сколько будет тормозить таблица, если в ней 1.5 млн. записей а полей с ограничением 7 шт.?
17 дек 15, 15:44    [18573604]     Ответить | Цитировать Сообщить модератору
 Re: непонятно, почему отрабатывает триггер ...  [new]
Glory
Member

Откуда:
Сообщений: 104760
SerRock
да, добрая мысль ... а на сколько будет тормозить таблица, если в ней 1.5 млн. записей а полей с ограничением 7 шт.?

Ммм, а вы себе как представляете работу unique constraint ?
Что оно постоянно сканит таблицу в поисках дубликатов ?
17 дек 15, 15:49    [18573629]     Ответить | Цитировать Сообщить модератору
 Re: непонятно, почему отрабатывает триггер ...  [new]
SerRock
Member

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

хе ... не знаю ... должно быть что то типа составного индекса ... при вставке или изменении записи закулисный код и должен проверять ...
17 дек 15, 16:01    [18573708]     Ответить | Цитировать Сообщить модератору
 Re: непонятно, почему отрабатывает триггер ...  [new]
Glory
Member

Откуда:
Сообщений: 104760
SerRock
должно быть что то типа составного индекса ... при вставке или изменении записи закулисный код и должен проверять ...

Разумеется.
Сколько по вашему в займет поиск в индексе ?
17 дек 15, 16:03    [18573719]     Ответить | Цитировать Сообщить модератору
 Re: непонятно, почему отрабатывает триггер ...  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31440
SerRock
хе ... не знаю ... должно быть что то типа составного индекса ... при вставке или изменении записи закулисный код и должен проверять ...
Триггеру то тоже нужно будет искать в таблице, нет ли там уже данных.
И желательно сделать для этого индекс.
И даже в этом случае триггер будет медленней.

Сделайте unique constrsint.

Он будет точно быстрее, и беспроблемнее в поддержке.
17 дек 15, 16:18    [18573809]     Ответить | Цитировать Сообщить модератору
 Re: непонятно, почему отрабатывает триггер ...  [new]
pXn
Member

Откуда: Косопузая
Сообщений: 45
Glory
SerRock
должно быть что то типа составного индекса ... при вставке или изменении записи закулисный код и должен проверять ...

Разумеется.
Сколько по вашему в займет поиск в индексе ?
Намного больше, чем триггер
17 дек 15, 16:19    [18573816]     Ответить | Цитировать Сообщить модератору
 Re: непонятно, почему отрабатывает триггер ...  [new]
SerRock
Member

Откуда:
Сообщений: 135
Огромное спасибо всем за добрые советы и поддержку ... сделал по совету Golry ...
18 дек 15, 07:24    [18576123]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить