Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 В процедуре запретить выполнять триггер  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Мне надо в процедуре, чтобы триггер на одной из таблиц не выполнялся.
Делаю:

create proc p1
..
ALTER TABLE DISABLE TRIGGER t1;
...

ALTER TABLE ENABLE TRIGGER t1;
...
return @rc;
end -- of proc

В приложении даю юзеру сообщение, что надо выполнять действие, когда нет активных юзеров.
Может нужно какие-то дополнительные действия дял гарантии, ну там блокировать таблицу и т.д..?
28 ноя 11, 18:36    [11673659]     Ответить | Цитировать Сообщить модератору
 Re: В процедуре запретить выполнять триггер  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Выбранный способ:
а) небезопасен
б) снижает степень конкурентности доступа к таблице

Есть множество других вариантов. Например, в процедуре создавать временную таблицу с определенным именем, а в триггере проверять ее существование.
29 ноя 11, 00:13    [11674876]     Ответить | Цитировать Сообщить модератору
 Re: В процедуре запретить выполнять триггер  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
+ CONTEXT_INFO
+ Постоянная табла, записываешь @@SPID до изменения в таблице и удаляешь после.
29 ноя 11, 11:32    [11676152]     Ответить | Цитировать Сообщить модератору
 Re: В процедуре запретить выполнять триггер  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Mnior
+ CONTEXT_INFO
+ Постоянная табла, записываешь @@SPID до изменения в таблице и удаляешь после.

+ времянка, а в триггере чек на ее наличие; если есть - не выполняться
29 ноя 11, 12:11    [11676557]     Ответить | Цитировать Сообщить модератору
 Re: В процедуре запретить выполнять триггер  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
спасибо

еще такой вопрос: alter table в транзакцию не попадают, если использовать try catch для отлова ошибок и в кетче восстановить триггер - пройдет такое решение?
29 ноя 11, 13:20    [11677299]     Ответить | Цитировать Сообщить модератору
 Re: В процедуре запретить выполнять триггер  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Winnipuh
спасибо

еще такой вопрос: alter table в транзакцию не попадают, если использовать try catch для отлова ошибок и в кетче восстановить триггер - пройдет такое решение?
Во-первых, alter table таки транзакционен. Во-вторых, не все ошибки возможно отловить.
Так что, избранный вами способ с disable trigger рано или поздно приведет к проблемам.
29 ноя 11, 13:32    [11677440]     Ответить | Цитировать Сообщить модератору
 Re: В процедуре запретить выполнять триггер  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Кроме того, разрешать простому пользователю ALTER TABLE - это моветон
29 ноя 11, 13:41    [11677548]     Ответить | Цитировать Сообщить модератору
 Re: В процедуре запретить выполнять триггер  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
iap
Кроме того, разрешать простому пользователю ALTER TABLE - это моветон
Вообще смешивание DDL и DML - возмутительное нарушение всех основ SQL! :))
29 ноя 11, 13:43    [11677572]     Ответить | Цитировать Сообщить модератору
 Re: В процедуре запретить выполнять триггер  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
iap
iap
Кроме того, разрешать простому пользователю ALTER TABLE - это моветон
Вообще смешивание DDL и DML - возмутительное нарушение всех основ SQL! :))


знаю, стыжусь, но ... вариантов нет
29 ноя 11, 15:42    [11678601]     Ответить | Цитировать Сообщить модератору
 Re: В процедуре запретить выполнять триггер  [new]
Glory
Member

Откуда:
Сообщений: 104751
Winnipuh
знаю, стыжусь, но ... вариантов нет

А умный триггер почему не вариант ?
29 ноя 11, 15:44    [11678609]     Ответить | Цитировать Сообщить модератору
 Re: В процедуре запретить выполнять триггер  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Winnipuh
но ... вариантов нет
Фигасе.
29 ноя 11, 16:47    [11679058]     Ответить | Цитировать Сообщить модератору
 Re: В процедуре запретить выполнять триггер  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 600
Mnior,

А если в параллели вызовется процедура, что вы будете делать?


Единственный вариант в самом триггере проверять не запущена ли сейчас процедура.. но и то жуткие грабли
30 ноя 11, 12:40    [11682592]     Ответить | Цитировать Сообщить модератору
 Re: В процедуре запретить выполнять триггер  [new]
baracs
Member

Откуда: Москва
Сообщений: 7217
Andrey Sribnyak
Mnior,

А если в параллели вызовется процедура, что вы будете делать?
В чем проблема с этими вариантами?
30 ноя 11, 12:51    [11682695]     Ответить | Цитировать Сообщить модератору
 Re: В процедуре запретить выполнять триггер  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Andrey Sribnyak
Mnior,

А если в параллели вызовется процедура, что вы будете делать?


Единственный вариант в самом триггере проверять не запущена ли сейчас процедура.. но и то жуткие грабли
Ну вызовется. И что по вашему произойдет в каждом из трех предложенных вариантов?
30 ноя 11, 13:28    [11683008]     Ответить | Цитировать Сообщить модератору
 Re: В процедуре запретить выполнять триггер  [new]
flexgen
Member

Откуда: Город на песке
Сообщений: 852
Winnipuh
знаю, стыжусь, но ... вариантов нет


Пользователь хочет на лету структуру таблиц менять? Попытайся все-таки убедить что так делать неправильно. Сам с такими требованиями сталкивался, получилось убедить в своей правоте.
30 ноя 11, 13:41    [11683127]     Ответить | Цитировать Сообщить модератору
 Re: В процедуре запретить выполнять триггер  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
flexgen
Winnipuh
знаю, стыжусь, но ... вариантов нет


Пользователь хочет на лету структуру таблиц менять? Попытайся все-таки убедить что так делать неправильно. Сам с такими требованиями сталкивался, получилось убедить в своей правоте.


не менять структуру.

Сделать некоторые изменения в данных, но на большой базе, когда работают все триггеры поулчается очень долго.
Для этого я сделал спец версию процедуры, которая отключает один вредный триггер, далает изменения в данных. затем делает изменения, которые делает триггер, но для частного случая это проще и возвращает триггер.

ну вот... да, процедура выполняется редко, и только админом.
30 ноя 11, 14:12    [11683493]     Ответить | Цитировать Сообщить модератору
 Re: В процедуре запретить выполнять триггер  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Andrey Sribnyak
Mnior,
А если в параллели вызовется процедура, что вы будете делать?
Единственный вариант в самом триггере проверять не запущена ли сейчас процедура.. но и то жуткие грабли
Внезапно. Да ещё и КО.

Или я не все посты могу видеть?
Во всяком случае Andrey Sribnyak явно не все читает.

Главное, что Winnipuh наконец то переделал свой случай на указанные варианты.
30 ноя 11, 14:29    [11683666]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить