|
Определить название процедуры, которая вызывает триггер
|
|||
---|---|---|---|
#18+
Нужно создать триггер, разрешающий вставку в таблицу только для одной процедуры. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
При выполнении процедуры вставки в таблицу выдает ошибку Сообщение 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.
Подскажите, пожалуйста, в чем может быть ошибка ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2020, 15:50 |
|
Определить название процедуры, которая вызывает триггер
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2020, 16:09 |
|
Определить название процедуры, которая вызывает триггер
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2020, 17:25 |
|
Определить название процедуры, которая вызывает триггер
|
|||
---|---|---|---|
#18+
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 Значит, вы сами должны позаботиться о вставке, апдейте или удалении. Если, конечно, не захотите сделать что-то другое. Например, вставка или удаление или апдейт в [dbo].[Anna_test] не произойдёт из-за показанного триггера. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2020, 17:52 |
|
Определить название процедуры, которая вызывает триггер
|
|||
---|---|---|---|
#18+
Anny88, в процедуре можно создать CONTEXT_INFO(), а триггере сверить с нужным значением и выполнить или не выполнить действие. В этом случае переименование или перемещение процедуры не повлияет на результат. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2020, 18:46 |
|
Определить название процедуры, которая вызывает триггер
|
|||
---|---|---|---|
#18+
Владислав Колосов Anny88, в процедуре можно создать CONTEXT_INFO(), а триггере сверить с нужным значением и выполнить или не выполнить действие. В этом случае переименование или перемещение процедуры не повлияет на результат. Эээ-х. И ведь никто не сказал о полной бессмысленности указанного действа. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2020, 19:25 |
|
Определить название процедуры, которая вызывает триггер
|
|||
---|---|---|---|
#18+
aleks222, что не так с context_info? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2020, 20:37 |
|
Определить название процедуры, которая вызывает триггер
|
|||
---|---|---|---|
#18+
Anny88 Нужно создать триггер, разрешающий вставку в таблицу только для одной процедуры А зачем так? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2020, 20:40 |
|
Определить название процедуры, которая вызывает триггер
|
|||
---|---|---|---|
#18+
Критик Anny88 Нужно создать триггер, разрешающий вставку в таблицу только для одной процедуры А зачем так? или как раз в этом и смысл? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2020, 22:10 |
|
Определить название процедуры, которая вызывает триггер
|
|||
---|---|---|---|
#18+
Владислав Колосов aleks222, что не так с context_info? Бессмысленно это в целом. Но если тебе про context_info - оно доступно ЛЮБОМУ пользователю => я туда могу сунуть "чего надо" и все "запреты" пойдут лесом. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2020, 06:33 |
|
Определить название процедуры, которая вызывает триггер
|
|||
---|---|---|---|
#18+
aleks222, согласен, с точки зрения безопасности надо использовать другие средства. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2020, 09:23 |
|
Определить название процедуры, которая вызывает триггер
|
|||
---|---|---|---|
#18+
Так, а если мне в 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] - не получается(( ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2020, 10:08 |
|
Определить название процедуры, которая вызывает триггер
|
|||
---|---|---|---|
#18+
Anny88, Мне подсказывали умные люди здесь как выполнять тригер тольок в определенном случае проаверять наличие #Tmp_trigger таблицы и если она есть то не выполнять ну т.е моя цель была disable trigger в опеределенной сессии. вполне можно использовать эту идею наооборот если есть наличие этой таблицы (созданной в SP) и выполнять действия только в этом лсучае. ЗЫ конечно никто не помешает программисту создать - как и выполнить код но для простого юзера не могущего залезть в код имхо самое то. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2020, 10:21 |
|
Определить название процедуры, которая вызывает триггер
|
|||
---|---|---|---|
#18+
Anny88, Процедура может выполняться, но не упоминаться в inputbuffer. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2020, 10:29 |
|
Определить название процедуры, которая вызывает триггер
|
|||
---|---|---|---|
#18+
Гулин Федор, у вас громоздкий велосипед, обычно такие задачи решаются с помощью прав: забираются права изменения у всех кроме определенного тех.пользователя процедуру вы объявляете с кляузоq with execute as 'тех.пользователь' и выполняете манипуляции с данными таблицы сорян, немного быстро прочел может Вам нужно что бы триггер работал постоянно не не в случае действий из процедуры, но смысл в этом же, проверять текущий контекст пользователя - вы должны обеспечить возможность получить контекст только из процедуры. (к dbo это конечно не относится) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2020, 10:36 |
|
|
start [/forum/topic.php?fid=46&msg=39994144&tid=1685709]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 254ms |
total: | 398ms |
0 / 0 |