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

Откуда:
Сообщений: 3
Нахожусь в некотором тупике. Имеется база base1 и база base2. В base1 некая программа(конкретно Quik) сыпет данные в таблицу Table1 по ODBC. Встала задача по триггеру на update вызвать процедуру Proc1 в base2.

USE base1
CREATE TRIGGER dbo.UpdateTrigger
ON dbo.Table1
AFTER UPDATE
AS
BEGIN
EXEC base2.dbo.Proc1
END

При включении данного триггера, некая программа получает отлуп, сыпятся ошибки вида: SQLState = 37000, Code = 102
Error = [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near...
Записи не обновляются.
Поймал трейсом(SQL Server Profiler) код, который формирует программа, исполняю его в SQL Query Analizer, никаких ошибок, запись корректно обновляется. Исполняю этот код из под программы через ODBC, ошибок нет, запись обновляется.
Замечу, что дошел уже до того, что процедура Proc1 имеет вид:
CREATE PROCEDURE [dbo].[Proc1] AS
BEGIN
SET NOCOUNT ON
END

Cоздал процедуру Proc1 такого же вида в base1, триггер модифицировал:
USE base1
CREATE TRIGGER dbo.UpdateTrigger
ON dbo.Table1
AFTER UPDATE
AS
BEGIN
EXEC dbo.Proc1
END

Никаких ошибок, записи обновляются.
В трейсе видно, что когда идет вызов процедуры в base2, идет какой-то отлуп и транзакции ролбэчаться.
В случае ошибки в трейсе идет код вида:
...
SP:StmtStarting EXEC base2.dbo.Proc1 ... base1
Scan:Started...Base2
Scan:Started...Base2
Scan:Started...Base2
Scan:Started...Base2
Scan:Started...Base2
Scan:Started...Base2
SP:Completed UPDATE [base1].[dbo].[Table1] set... base1
SQLTransaction... 2 - Rollback... base1
TransactionLog... base1
TransactionLog... base1
SQL:BatchCompleted UPDATE [base1].[dbo].[Table1] set... base1 1 - Error


Если исполнять процедуру в base1, то трейс выглядит как-то так:
...
SP:StmtStarting EXEC base1.dbo.Proc1 ... base1
SP:CacheHit... base1
Audit Schema Object Access Event EXEC base1.dbo.Proc1 ... base1
SP:Starting EXEC base1.dbo.Proc1 ... base1
SP:StmtStarting SET NOCOUNT ON ... base1
SP:StmtCompleted SET NOCOUNT ON ... base1
SP:Completed EXEC base1.dbo.Proc1 ... base1
SP:StmtCompleted EXEC base1.dbo.Proc1 ... base1
SP:Completed EXEC base1.dbo.Proc1 ... base1
SQLTransaction... 1 - Commit ... base1
TransactionLog... base1
SP:StmtCompleted UPDATE [base1].[dbo].[Table1] set...
SQL:BatchCompleted UPDATE [base1].[dbo].[Table1] set... 0 - OK


Если ставлю в триггере вызов EXEC base2.dbo.Proc1 и исполняю в SQL Query Analizer тупо UPDATE [base1].[dbo].[Table1] set..., то трейс получаю аналогичный трейсу из некоей проги, когда в триггере стоит EXEC base1.dbo.Proc1. Никаких Scan:Started... base2 не наблюдается, которые видны в трейсе приводящем к ошибке. Я в легком ступоре, куда копать.
20 ноя 13, 18:03    [15163799]     Ответить | Цитировать Сообщить модератору
 Re: Вызов процедуры другой базы в триггере  [new]
AirMike
Member

Откуда:
Сообщений: 3
Ох, лоханулся то как. Логин с которым некая прога коннектится к серверу имеет права только на base1. Сделал права на base2, все стало нормально. Проблема, что везде исполнял запрос с sa, само собой ошибок не получал(
Вопрос снимается.
20 ноя 13, 18:10    [15163855]     Ответить | Цитировать Сообщить модератору
 Re: Вызов процедуры другой базы в триггере  [new]
Crimean
Member

Откуда:
Сообщений: 13148
AirMike,

есть же способы обойти эти ограничения, но у всех побочные эффекты. начиная от "ownrership chain" и до всяких "execute as"
20 ноя 13, 18:29    [15164004]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить