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

Откуда:
Сообщений: 34
База данных MS SQL 2012.

Есть таблица №1. У нее триггер на Insert.
В таблицу записи может вставить:
1. Внешнее приложение.
2. процедура.
3. триггер другой таблицы №2.

Все три варианта могут выполняться одновременно.


И все же! Может ли триггер таблицы №1 определить откуда пришли вставленные записи
для каждой из строк?
САМОСТОЯТЕЛЬНО! БЕЗ ПЕРЕДАЧИ ДОПОЛНИТЕЛЬНЫХ ПОЛЕЙ, ТИПА НАЗВАНИЯ ПРОЦЕДУРЫ.
27 апр 15, 12:45    [17568658]     Ответить | Цитировать Сообщить модератору
 Re: Старое о новом. Кто вызвал....?  [new]
o-o
Guest
не, не может,
да еще хороший SSIS-пакет с дефолтными настрйками вообще вставит в обход триггера
(загрузка Import/Export-визардом из какого-нибудь Экселя туда же)
27 апр 15, 12:51    [17568699]     Ответить | Цитировать Сообщить модератору
 Re: Старое о новом. Кто вызвал....?  [new]
Tangous
Member

Откуда:
Сообщений: 34
Печально.
27 апр 15, 13:45    [17569082]     Ответить | Цитировать Сообщить модератору
 Re: Старое о новом. Кто вызвал....?  [new]
o-o
Guest
когда триггер из триггера, помогает TRIGGER_NESTLEVEL.
но первые 2 в 2008 R2 никак, но может появилось что в 2012, а я не знаю, есть слабая надежда :)
27 апр 15, 14:06    [17569215]     Ответить | Цитировать Сообщить модератору
 Re: Старое о новом. Кто вызвал....?  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Можете попробовать использовать @@spid в момент вставки, а по этому значению попытаться определить кто именно вставляет записи.
27 апр 15, 14:07    [17569219]     Ответить | Цитировать Сообщить модератору
 Re: Старое о новом. Кто вызвал....?  [new]
Tangous
Member

Откуда:
Сообщений: 34
select object_name(@@PROCID)

дает только название самого триггере в таблице №1 и все.
Никаких внешних источников @@PROCID не содержит.

Похоже придется вводить еще одно поле...
27 апр 15, 14:36    [17569472]     Ответить | Цитировать Сообщить модератору
 Re: Старое о новом. Кто вызвал....?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Tangous
select object_name(@@PROCID)

дает только название самого триггере в таблице №1 и все.
Никаких внешних источников @@PROCID не содержит.

Похоже придется вводить еще одно поле...
Если вставляющего что-то принуждает называть себя при вставке,
то можно передавать информацию в триггер через CONTEXT_INFO.
То есть, можно откатывать (или не допускать) вставку,
если CONTEXT_INFO ничего не содержит.
27 апр 15, 14:41    [17569515]     Ответить | Цитировать Сообщить модератору
 Re: Старое о новом. Кто вызвал....?  [new]
Tangous
Member

Откуда:
Сообщений: 34
select object_name(@@spid)


на выходе выдает только одно 'sys.sysdesend'
тоже ничем не помогает.
27 апр 15, 14:51    [17569627]     Ответить | Цитировать Сообщить модератору
 Re: Старое о новом. Кто вызвал....?  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
Если озвучите задачу, а не ваш способ ее решения, может кто чего дельное и присоветует.
27 апр 15, 15:07    [17569776]     Ответить | Цитировать Сообщить модератору
 Re: Старое о новом. Кто вызвал....?  [new]
Tangous
Member

Откуда:
Сообщений: 34
Задача "тривиальная" разобраться в зацикливании связки триггеров и процедур.
Да еще и в коде который не я писал.

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

CONTEXT_INFO - очень хорошая мысль.
Попробую.
27 апр 15, 15:30    [17570004]     Ответить | Цитировать Сообщить модератору
 Re: Старое о новом. Кто вызвал....?  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Tangous
select object_name(@@spid)


на выходе выдает только одно 'sys.sysdesend'
тоже ничем не помогает.

Попробуйте сюда привязать некоторые системные вьюхи и таблицы.
Например sysprocesses
27 апр 15, 16:30    [17570591]     Ответить | Цитировать Сообщить модератору
 Re: Старое о новом. Кто вызвал....?  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Посмотрите, может отсюда сможете взять что-то полезное
select * from sys.sysprocesses where spid = @@spid
27 апр 15, 16:33    [17570630]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить