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

Каким образом процедура может выяснить имя вызвавшей ее процедуры? Или, более конкретно, как триггер таблицы может узнать, какая процедура вызвала изменение/добавление/удаление, запустившее триггер.
...
Рейтинг: 0 / 0
13.11.2002, 12:19:04
    #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
13.11.2002, 14:25:06
    #32067482
Doc
Doc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как триггеру узнать имя процедуры, вызвавшей изменения в таблице?
Смотри SET CONTEXT_INFO в BOL.
...
Рейтинг: 0 / 0
13.11.2002, 14:31:03
    #32067492
jimmers
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как триггеру узнать имя процедуры, вызвавшей изменения в таблице?
2Doc:

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

The CREATE TABLE statement is not allowed within a trigger

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

Есть и другой метод, не очень хороший. В триггере делается вызов процедуры. После создания триггера, в той процедуре добавляется код с CREATE TABLE. Триггер больше не ругается и работает. НО, как только триггер перекомпилять, он сразу начинает ругаться на CREATE TABLE.
...
Рейтинг: 0 / 0
18.11.2002, 12:52:20
    #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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как триггеру узнать имя процедуры, вызвавшей изменения в таблице? / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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