powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Определить название процедуры, которая вызывает триггер
15 сообщений из 15, страница 1 из 1
Определить название процедуры, которая вызывает триггер
    #39994144
Anny88
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно создать триггер, разрешающий вставку в таблицу только для одной процедуры.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Alter Trigger [dbo].[Anna_test_NoUserUpdate] On [dbo].[Anna_test] Instead Of Insert, Delete, Update Not For Replication
As

Begin
	Declare @proc VarChar(255)
	CREATE TABLE #TMP(EventType nvarchar(30), Parameters int, EventInfo nvarchar(255))
	INSERT #TMP EXEC('DBCC INPUTBUFFER(' + @@spid + ') WITH TABLERESULTS')
	SELECT @proc=EventInfo FROM #TMP
	If @proc Not Like'Anna_test_2'
	 RaisError ('Not',11, 1)
    Return
End



При выполнении процедуры вставки в таблицу выдает ошибку
Сообщение 2532, уровень 16, состояние 1, строка 33
One or more WITH options specified are not valid for this command.


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
Create Table Anna_test (Id Int Identity (1,1), a Int)
Select * From Anna_test
Insert Into Anna_test (a) Values (1),(2),(3)

Create Procedure [dbo].[Anna_test_2]
As
Insert Into Anna_test (a) Values (4),(5),(6)

Execute [dbo].[Anna_test_2]



Подскажите, пожалуйста, в чем может быть ошибка
...
Рейтинг: 0 / 0
Определить название процедуры, которая вызывает триггер
    #39994149
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anny88,

нет такой опции у INPUTBUFFER
https://docs.microsoft.com/ru-ru/sql/t-sql/database-console-commands/dbcc-inputbuffer-transact-sql?view=sql-server-ver15
Код: sql
1.
2.
DBCC INPUTBUFFER ( session_id [ , request_id ])  
[WITH NO_INFOMSGS]  
...
Рейтинг: 0 / 0
Определить название процедуры, которая вызывает триггер
    #39994173
Anny88
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court, Спасибо, убрала, заработало!!

А по триггеру можете еще подсказать: если проверку не прошел, то ошибка, а если нужная процедура меняет, то как сказать все равно вставляй?

Т.е. я не хочу делать триггер на after update а потом откатывать, а сразу проверять: вставлять или не вставлять. Так можно?

Alter Trigger [dbo].[Anna_test_NoUserUpdate] On [dbo].[Anna_test] Instead Of Insert, Delete, Update Not For Replication
As

CREATE TABLE #TMP(EventType nvarchar(30), Parameters int, EventInfo nvarchar(4000))
INSERT #TMP EXEC('DBCC INPUTBUFFER(' + @@spid + ')')

SELECT EventInfo FROM #TMP
Select * From Anna_test

If Not Exists(Select Top 1 1 From #TMP Where EventInfo Like '%Anna_test_2%')
Begin
Print 'Not'--RaisError ('Not',11, 1)
Drop Table #TMP
Return
End
Select * From Anna_test
Select 'end'
Drop Table #TMP
...
Рейтинг: 0 / 0
Определить название процедуры, которая вызывает триггер
    #39994188
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anny88
court, Спасибо, убрала, заработало!!

А по триггеру можете еще подсказать: если проверку не прошел, то ошибка, а если нужная процедура меняет, то как сказать все равно вставляй?

Т.е. я не хочу делать триггер на after update а потом откатывать, а сразу проверять: вставлять или не вставлять. Так можно?

Alter Trigger [dbo].[Anna_test_NoUserUpdate] On [dbo].[Anna_test] Instead Of Insert, Delete, Update Not For Replication
As

CREATE TABLE #TMP(EventType nvarchar(30), Parameters int, EventInfo nvarchar(4000))
INSERT #TMP EXEC('DBCC INPUTBUFFER(' + @@spid + ')')

SELECT EventInfo FROM #TMP
Select * From Anna_test

If Not Exists(Select Top 1 1 From #TMP Where EventInfo Like '%Anna_test_2%')
Begin
Print 'Not'--RaisError ('Not',11, 1)
Drop Table #TMP
Return
End
Select * From Anna_test
Select 'end'
Drop Table #TMP
До триггеров INSTEAD OF ... ничего не происходит.
Значит, вы сами должны позаботиться о вставке, апдейте или удалении.
Если, конечно, не захотите сделать что-то другое.
Например, вставка или удаление или апдейт в [dbo].[Anna_test] не произойдёт из-за показанного триггера.
...
Рейтинг: 0 / 0
Определить название процедуры, которая вызывает триггер
    #39994211
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anny88,

в процедуре можно создать CONTEXT_INFO(), а триггере сверить с нужным значением и выполнить или не выполнить действие. В этом случае переименование или перемещение процедуры не повлияет на результат.
...
Рейтинг: 0 / 0
Определить название процедуры, которая вызывает триггер
    #39994221
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
Anny88,

в процедуре можно создать CONTEXT_INFO(), а триггере сверить с нужным значением и выполнить или не выполнить действие. В этом случае переименование или перемещение процедуры не повлияет на результат.

Эээ-х.
И ведь никто не сказал о полной бессмысленности указанного действа.
...
Рейтинг: 0 / 0
Определить название процедуры, которая вызывает триггер
    #39994234
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222,

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


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


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

что не так с context_info?


Бессмысленно это в целом.

Но если тебе про context_info - оно доступно ЛЮБОМУ пользователю => я туда могу сунуть "чего надо" и все "запреты" пойдут лесом.
...
Рейтинг: 0 / 0
Определить название процедуры, которая вызывает триггер
    #39994318
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222,

согласен, с точки зрения безопасности надо использовать другие средства.
...
Рейтинг: 0 / 0
Определить название процедуры, которая вызывает триггер
    #39994331
Anny88
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так, а если мне в EventInfo приходит команда, проходит проверку, я же могу ее в переменную считать..

CREATE TABLE #TMP(EventType nvarchar(30), Parameters int, EventInfo nvarchar(4000))
INSERT #TMP EXEC('DBCC INPUTBUFFER(' + @@spid + ')')

SELECT EventInfo FROM #TMP

Типа такого
Declare @com VarChar(4000)
SELECT @com=EventInfo FROM #TMP

В @com приходит Execute [dbo].[Anna_test_2]

Но выполнить как?..

exec @com

тогда получается exec Execute [dbo].[Anna_test_2] - не получается((
...
Рейтинг: 0 / 0
Определить название процедуры, которая вызывает триггер
    #39994334
Гулин Федор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anny88,
Мне подсказывали умные люди здесь
как выполнять тригер тольок в определенном случае

проаверять наличие #Tmp_trigger таблицы
и если она есть то не выполнять

ну т.е моя цель была disable trigger в опеределенной сессии.
вполне можно использовать эту идею наооборот
если есть наличие этой таблицы (созданной в SP) и выполнять действия только в этом лсучае.


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

Процедура может выполняться, но не упоминаться в inputbuffer.
...
Рейтинг: 0 / 0
Определить название процедуры, которая вызывает триггер
    #39994344
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гулин Федор,

у вас громоздкий велосипед, обычно такие задачи решаются с помощью прав:

забираются права изменения у всех кроме определенного тех.пользователя
процедуру вы объявляете с кляузоq with execute as 'тех.пользователь' и выполняете манипуляции с данными таблицы

сорян, немного быстро прочел может Вам нужно что бы триггер работал постоянно не не в случае действий из процедуры, но смысл в этом же, проверять текущий контекст пользователя - вы должны обеспечить возможность получить контекст только из процедуры. (к dbo это конечно не относится)
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Определить название процедуры, которая вызывает триггер
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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