Старое о новом. Кто вызвал....?

Tangous
Дата: 27.04.2015 12:45:14
База данных MS SQL 2012.

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

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


И все же! Может ли триггер таблицы №1 определить откуда пришли вставленные записи
для каждой из строк?
САМОСТОЯТЕЛЬНО! БЕЗ ПЕРЕДАЧИ ДОПОЛНИТЕЛЬНЫХ ПОЛЕЙ, ТИПА НАЗВАНИЯ ПРОЦЕДУРЫ.
o-o
Дата: 27.04.2015 12:51:11
не, не может,
да еще хороший SSIS-пакет с дефолтными настрйками вообще вставит в обход триггера
(загрузка Import/Export-визардом из какого-нибудь Экселя туда же)
Tangous
Дата: 27.04.2015 13:45:55
Печально.
o-o
Дата: 27.04.2015 14:06:58
когда триггер из триггера, помогает TRIGGER_NESTLEVEL.
но первые 2 в 2008 R2 никак, но может появилось что в 2012, а я не знаю, есть слабая надежда :)
SQL2008
Дата: 27.04.2015 14:07:32
Можете попробовать использовать @@spid в момент вставки, а по этому значению попытаться определить кто именно вставляет записи.
Tangous
Дата: 27.04.2015 14:36:05
select object_name(@@PROCID)

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

Похоже придется вводить еще одно поле...
iap
Дата: 27.04.2015 14:41:03
Tangous
select object_name(@@PROCID)

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

Похоже придется вводить еще одно поле...
Если вставляющего что-то принуждает называть себя при вставке,
то можно передавать информацию в триггер через CONTEXT_INFO.
То есть, можно откатывать (или не допускать) вставку,
если CONTEXT_INFO ничего не содержит.
Tangous
Дата: 27.04.2015 14:51:03
select object_name(@@spid)


на выходе выдает только одно 'sys.sysdesend'
тоже ничем не помогает.
invm
Дата: 27.04.2015 15:07:39
Если озвучите задачу, а не ваш способ ее решения, может кто чего дельное и присоветует.
Tangous
Дата: 27.04.2015 15:30:12
Задача "тривиальная" разобраться в зацикливании связки триггеров и процедур.
Да еще и в коде который не я писал.

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

CONTEXT_INFO - очень хорошая мысль.
Попробую.