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

Откуда: Toronto
Сообщений: 5
Уважаемые Господа,

Требуется консультация специалистов по управлению трансакциями в MSSQL 2008.

Синопсис:
Имеется около 50 триггеров , примерно по 800-1000 строк каждый, написанные в одной и той же манере под Sybase'овский "rollback trigger". Это такой хитрый rollback, который откатывает не только сам триггер, но и тот оператор которым этот триггер был активирован.
Полученный в результате миграции на MSSQL 2008 монструозный Transact-SQL код этих триггеров может исполнять свои функции только в очень узком контексте вызова. Триггер должен быть активирован исключительно в контексте stored procedure, только в контексте внешней трансакции и только при условии наличия во внешней трансакции точки отката "save tran SSMA$ROLLBACK_TRIGGER$SP", где метка этой точки отката не может быть иной чем "SSMA$ROLLBACK_TRIGGER$SP"...
В результате 50% активаций этих триггеров из front-end приложений ломаются с замечательной диагностикой типа "Попытка отката к несуществующей точке сохранения SSMA$ROLLBACK_TRIGGER$SP". Пользователи в восторге. Разработчики БД тихо наслаждаются мощью своего интеллекта.

Вопрос:
Можно ли средствами Transact-SQL, или обращением к каким-либо системным свойствам сервера/БД определить наличие/отсутствие в текущей трансакции точки сохранения (savepoint) с заданной меткой?
Или определить хотя бы факт наличия точки сохранения?
Если бы добавить такую проверку в триггер, то все проблемы front-end разрешаются автоматически...


Заранее благодарен за любые советы и помощь.
25 апр 14, 21:01    [15938291]     Ответить | Цитировать Сообщить модератору
 Re: Узко-специальный вопрос по SAVE TRANSACTION <savepoint_label>  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3274
Определить наличие сейвпойнта - нельзя, вроде. А что, в Sybase можно? Вариант возврата не рассматриваете?

Если триггеры должны срабатывать только из хранимок - уберите триггеры вообще, их код поместите в обычные хранимки и вызывайте их оттуда, откуда они должны срабатывать. И когда должны. Разве что код надо будет переделать, чтобы без обращений к inserted / deleted работал - ну да в 2008 как раз появились table-valued parameters.
25 апр 14, 22:15    [15938568]     Ответить | Цитировать Сообщить модератору
 Re: Узко-специальный вопрос по SAVE TRANSACTION <savepoint_label>  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
slyPolarCat
Или определить хотя бы факт наличия точки сохранения?
sys.dm_tran_session_transactions + sys.dm_tran_database_transactions
Если значение в столбце database_transaction_most_recent_savepoint_lsn not null, значит есть точка сохранения.
25 апр 14, 22:18    [15938578]     Ответить | Цитировать Сообщить модератору
 Re: Узко-специальный вопрос по SAVE TRANSACTION <savepoint_label>  [new]
slyPolarCat
Member

Откуда: Toronto
Сообщений: 5
Ennor Tiegael
Определить наличие сейвпойнта - нельзя, вроде.

Ежели это Adelaide Down Under - то неправда ваша, гражданин антипод.
А вот если это Adelaide, California или Adelaide, Georgia - то тогда тем более неправда ваша, товарищ американец.
26 апр 14, 02:25    [15939349]     Ответить | Цитировать Сообщить модератору
 Re: Узко-специальный вопрос по SAVE TRANSACTION <savepoint_label>  [new]
slyPolarCat
Member

Откуда: Toronto
Сообщений: 5
Уважаемый invm,
Огромное человеческое спасибо.
invm
sys.dm_tran_session_transactions + sys.dm_tran_database_transactions
Если значение в столбце database_transaction_most_recent_savepoint_lsn not null, значит есть точка сохранения.

Это решение сняло 99% проблем front-end, и надо будет слегка переделать всего 47 скриптов. Я уже набросал образец изменений местным fulltime-дармоедам и пусть правят триггеры по шаблону. Тут ума не надо, так что, думаю, за пару недель управятся.
Небольшая техническая трудность состоит в том, что пользователям по уровню их доступа не видны системные view sys.dm_*.
Но, как говорил мышь из старого анекдота - это проблемы уровня исполнителя, и решаются в рабочем порядке.

Ещё раз огромное спасибо, приятно иметь дело с профессионалом.
Будете у нас на Колыме - выпивка за мой счёт.
26 апр 14, 02:45    [15939369]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить