powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как триггеру узнать имя процедуры, вызвавшей изменения в таблице?
8 сообщений из 8, страница 1 из 1
Как триггеру узнать имя процедуры, вызвавшей изменения в таблице?
    #32067263
Mic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mic
Гость
Давно меня мучает вопрос.

Каким образом процедура может выяснить имя вызвавшей ее процедуры? Или, более конкретно, как триггер таблицы может узнать, какая процедура вызвала изменение/добавление/удаление, запустившее триггер.
...
Рейтинг: 0 / 0
Как триггеру узнать имя процедуры, вызвавшей изменения в таблице?
    #32067367
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно получить имя процедуры, которая была вызвана клиентом и если она непосредственно работает с таблицей, то все ок. Если же она вызывает другую, то тут не знаю...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
USE tempdb
GO

CREATE TABLE dbo.Table1 (id int identity primary key, txt varchar( 1000 ))
GO

CREATE TRIGGER dbo.Table1_INS 
    ON dbo.Table1 
   FOR INSERT 
AS 
CREATE TABLE #TMP(EventType nvarchar( 30 ), Parameters int, EventInfo nvarchar( 255 ))
INSERT #TMP EXEC('DBCC INPUTBUFFER(' + @@spid + ') WITH TABLERESULTS')
SELECT EventInfo AS Caller FROM #TMP
GO

CREATE PROCEDURE dbo.TEST_INSERT AS INSERT dbo.Table1 VALUES ('Test')
GO

EXEC dbo.TEST_INSERT
GO
...
Рейтинг: 0 / 0
Как триггеру узнать имя процедуры, вызвавшей изменения в таблице?
    #32067482
Doc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотри SET CONTEXT_INFO в BOL.
...
Рейтинг: 0 / 0
Как триггеру узнать имя процедуры, вызвавшей изменения в таблице?
    #32067492
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Doc:

Причем здесь CONTEXT_INFO?
...
Рейтинг: 0 / 0
Как триггеру узнать имя процедуры, вызвавшей изменения в таблице?
    #32067670
Осирис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня говорит следующее:

The CREATE TABLE statement is not allowed within a trigger

Как я понимаю, есть опция, которая позыоляет триггеру создавать таблицы. Не подскажите какая ?
...
Рейтинг: 0 / 0
Как триггеру узнать имя процедуры, вызвавшей изменения в таблице?
    #32067706
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Mic
сложно это и зачем сопсно ...
2 Осирис
по моему такой опции нет...
...
Рейтинг: 0 / 0
Как триггеру узнать имя процедуры, вызвавшей изменения в таблице?
    #32067813
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опции такой нет. Но, это ограничение можно обойти - SELECT INTO не запрещен.

Есть и другой метод, не очень хороший. В триггере делается вызов процедуры. После создания триггера, в той процедуре добавляется код с CREATE TABLE. Триггер больше не ругается и работает. НО, как только триггер перекомпилять, он сразу начинает ругаться на CREATE TABLE.
...
Рейтинг: 0 / 0
Как триггеру узнать имя процедуры, вызвавшей изменения в таблице?
    #32068927
Mic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mic
Гость
Спасибо, jimmers

Ниже рабочий вариант скрипта (без CREATE TABLE в триггере). Но, к сожалению, он выдает не имя вызывающей добавление процедуры, а текст всего SQL пакета, содержащего эту процедуру.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
USE tempdb
GO

CREATE TABLE dbo.Table1 (id int identity primary key, txt varchar( 1000 ))
GO

CREATE TRIGGER dbo.Table1_INS 
    ON dbo.Table1 
   FOR INSERT 
AS 

SELECT EventType=convert(nvarchar( 30 ),null),Parameters=convert(int,null), EventInfo=convert(nvarchar( 255 ),null)
INTO #TMP
delete  #TMP

declare @command varchar( 100 )

SELECT @command='DBCC INPUTBUFFER(' + str(@@spid) + ') WITH TABLERESULTS'  
INSERT #TMP EXEC(@command)
SELECT EventInfo AS Caller FROM #TMP
GO

CREATE PROCEDURE dbo.TEST_INSERT AS INSERT dbo.Table1 VALUES ('Test')
GO

EXEC dbo.TEST_INSERT
go

DROP TABLE dbo.Table1
DROP PROC dbo.TEST_INSERT
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как триггеру узнать имя процедуры, вызвавшей изменения в таблице?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]