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

Откуда:
Сообщений: 177
Прошу подсказку в следующей ситуации.
Вот триггер INSTEAD OF DELETE на таблице INVOICES:
CREATE TRIGGER [dbo].[INVOICES_trd] ON [dbo].[INVOICES]
WITH EXECUTE AS CALLER
INSTEAD OF DELETE
AS
BEGIN
  DECLARE @DEL_INV_ID INT
  DECLARE DEL_INVS CURSOR FOR
    SELECT INV_ID FROM DELETED
    
  OPEN DEL_INVS
  FETCH DEL_INVS INTO @DEL_INV_ID 
  WHILE @@FETCH_STATUS = 0
  BEGIN
    EXEC UPD_PAYM @DEL_INV_ID 
    DELETE FROM FINLINKS WHERE INV_ID = @DEL_INV_ID 
    UPDATE JOBS SET INV_ID = NULL WHERE INV_ID = @DEL_INV_ID 
    DELETE FROM INVOICES WHERE INV_ID = @DEL_INV_ID 
    FETCH DEL_INVS INTO @DEL_INV_ID 
  END
  CLOSE DEL_INVS
  DEALLOCATE DEL_INVS
END
GO

К инвойсам прилинковываются работы посредством поля JOBS.INV_ID.
Есть и платежи, которые связвны с инвойсами через таблицу FINLINKS.
Так вот, когда я удаляю инвойс, к которому прилинкована всего одна JOB, то все проходит гладко.
А когда прилинковано более одной раблты, то при выполнении строки триггера
UPDATE JOBS SET INV_ID = NULL WHERE INV_ID = @DEL_INV_ID 

получаю ошибку:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. The statement has been terminated.

Никак не пойму, почему не может выполниться простая операция, которая меняет более одной строки ?
Как в данной ситуации "правильно" отлинковать работы от инвойса ?
23 янв 15, 14:32    [17159979]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите в ситуации с триггером  [new]
Glory
Member

Откуда:
Сообщений: 104751
Alejandro
Никак не пойму, почему не может выполниться простая операция, которая меняет более одной строки ?

Потому что у таблицы JOBS тоже есть триггер. Который не умеет работать с множественными изменениями
23 янв 15, 14:36    [17160023]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите в ситуации с триггером  [new]
Alejandro
Member

Откуда:
Сообщений: 177
Да, точно, есть там триггер!
Буду смотреть.

Получается, что абсолютно на все триггеры в MSSQL нужно смотреть через "призму множественных обновлений" ?
Т.е. везде нужно делать обертку в виде курсора ?
Как-то в FB с таким не сталкивался...
23 янв 15, 14:49    [17160181]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите в ситуации с триггером  [new]
Glory
Member

Откуда:
Сообщений: 104751
Alejandro
Получается, что абсолютно на все триггеры в MSSQL нужно смотреть через "призму множественных обновлений" ?

Разумеется

Alejandro
Т.е. везде нужно делать обертку в виде курсора ?

Нет. Как раз наоборот
23 янв 15, 14:50    [17160194]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите в ситуации с триггером  [new]
Alejandro
Member

Откуда:
Сообщений: 177
Glory
Alejandro
Т.е. везде нужно делать обертку в виде курсора ?

Нет. Как раз наоборот

Пожалуйста, продолжите мысль.
А то чувствую, что наломаю лишних дров.
23 янв 15, 14:52    [17160227]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите в ситуации с триггером  [new]
Glory
Member

Откуда:
Сообщений: 104751
Alejandro
Пожалуйста, продолжите мысль.

Какую ? С наборами данных лучше всего работать как с наборами данных ?
23 янв 15, 14:53    [17160235]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите в ситуации с триггером  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
удалять из дочерних таблиц можно и без курсора
............
	DELETE F
	FROM DELETED D
	JOIN FINLINKS F 
	ON F.INV_ID = D.INV_ID 
...........
23 янв 15, 14:55    [17160252]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите в ситуации с триггером  [new]
Alejandro
Member

Откуда:
Сообщений: 177
Glory, LexusR
Ваша мысль понятна. Такие приемы я несколько раз уже использовал в триггерах.
Спасибо за подстказки.
Пойду копать триггеры на JOBS. А в них, в свою очередь, имеются обновления SUB_JOBS. А дальше... еще не заглядывал.
:)
23 янв 15, 15:10    [17160390]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите в ситуации с триггером  [new]
Glory
Member

Откуда:
Сообщений: 104751
Alejandro
Пойду копать триггеры на JOBS. А в них, в свою очередь, имеются обновления SUB_JOBS. А дальше... еще не заглядывал.
:)

Вообще-то полный текст сообщения об ошибке содержит имя программного модуля и номер строки в этом модуле
23 янв 15, 15:14    [17160424]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите в ситуации с триггером  [new]
Alejandro
Member

Откуда:
Сообщений: 177
Я привел полный текст ошибки, именно так как он звучит при выполнении запроса в SQL Manager 2010
При выполнении же запроса из приложения это сообщение еще предваряетя длинным префиксом от FireDAC, типа [FireDAC][Phys][ODBC][Microsoft][SQL Server Native Client 11.0][SQL Server]. Больше никакой конкретики нет.
23 янв 15, 16:22    [17160887]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите в ситуации с триггером  [new]
Glory
Member

Откуда:
Сообщений: 104751
Alejandro
Я привел полный текст ошибки, именно так как он звучит при выполнении запроса в SQL Manager 2010

Вы ошибаетесь. Или ваш SQL Manager 2010 показывает вам не все, что он получил от сервера
23 янв 15, 16:24    [17160908]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите в ситуации с триггером  [new]
Alejandro
Member

Откуда:
Сообщений: 177
Выглядит это вот так.
(Перед ошибкой - то отладочные PRINT`ы).

К сообщению приложен файл. Размер - 10Kb
23 янв 15, 16:30    [17160958]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите в ситуации с триггером  [new]
Glory
Member

Откуда:
Сообщений: 104751
Alejandro
Выглядит это вот так.
(Перед ошибкой - то отладочные PRINT`ы).

Выкиньте это приложение нафиг
23 янв 15, 16:33    [17160979]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите в ситуации с триггером  [new]
Alejandro
Member

Откуда:
Сообщений: 177
Есть еще SQL Server 2014 Management Studio, но я его на дух не переношу...
:)
23 янв 15, 16:39    [17161019]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите в ситуации с триггером  [new]
Alejandro
Member

Откуда:
Сообщений: 177
Хотя... в нем ошибка уже с деталями, как вы и говорили:

Msg 512, Level 16, State 1, Procedure JOBS_tru, Line 7
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.


Вон оно что оказывается...
23 янв 15, 16:43    [17161049]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите в ситуации с триггером  [new]
Glory
Member

Откуда:
Сообщений: 104751
Alejandro
Есть еще SQL Server 2014 Management Studio, но я его на дух не переношу...
:)

Наверное за то, что грузит лишней информацией вида
Msg 195, Level 15, State 10, Line 3
'try_convert' is not a recognized built-in function name.
23 янв 15, 16:43    [17161051]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите в ситуации с триггером  [new]
Alejandro
Member

Откуда:
Сообщений: 177
Да, именно так :)
23 янв 15, 16:44    [17161066]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите в ситуации с триггером  [new]
alexeyvg
Member

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

Как программист на Дельфи обычно складывает целые числа, не применяя циклы по битам, и не рассматривает оператор "+" как "особый приём".

А то ваш код выглядит комично для программиста СУБД: какие то курсоры, переменные и циклы вместо оператора "удалить". И естественно, такой код медленнее обрабатывается сервером.
23 янв 15, 17:53    [17161545]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите в ситуации с триггером  [new]
Alejandro
Member

Откуда:
Сообщений: 177
Я имел ввиду как раз вот этот прием:
	
  DELETE F
  FROM DELETED D
  JOIN FINLINKS F 
  ON F.INV_ID = D.INV_ID

В нескольких триггерах уже применял.

А на счет комичности кода... оснований с вами не соглашаться у меня нет.
С MSSQL ранее не приходилось сталкиваться. Опыта маловато.
Код триггеров переношу из базы на FB. А в нем нет понятий INSERTED, DELETED. Специфика своя.
Поэтому пока что код выглядит так, как выглядит.
23 янв 15, 18:58    [17161761]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите в ситуации с триггером  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31990
Alejandro
Я имел ввиду как раз вот этот прием:
Да, я понял. Вот так и надо писать.
24 янв 15, 09:24    [17163515]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить