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

Откуда:
Сообщений: 34
Базы данных на одном сервере (MYSERVER)

Пытаюсь из триггера в MyDataBase1.MyTable1 удалить данные в MyDataBase2.MyTable2

ALTER TRIGGER [dbo].[MyTrigger] 
   ON [dbo].[MyTable1] 
   AFTER UPDATE,INSERT,DELETE
AS 
BEGIN
SET NOCOUNT ON;
DELETE FROM MYSERVER.dbo.MyTable2
END

Получаю сообщение об ошибке.

Error code: -2147467259 Native Code: 916
Серверу участнику "MyDomain\MyUserName" не удалось обратиться к базе данных "MyDataBase2" в текущем контексте безопасности



Подскажите в чем проблема пожалуйста.
15 мар 12, 15:26    [12254159]     Ответить | Цитировать Сообщить модератору
 Re: Изменение данных в другой базе данных на одном сервере в триггере.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Если Ownership chaining настроен, включите Guest'а в базе MYSERVER, или создайте пользователя для текущего логина.
15 мар 12, 15:31    [12254227]     Ответить | Цитировать Сообщить модератору
 Re: Изменение данных в другой базе данных на одном сервере в триггере.  [new]
Сергей1979
Member

Откуда:
Сообщений: 34
В обоих базах данных есть пользователь MyDomain\MyUserName

т.е.
Имя пользователя = MyDomain\MyUserName
Имя входа = MyDomain\MyUserName

Про "Ownership chaining" честно не знаю, что и где настроить.
15 мар 12, 16:06    [12254638]     Ответить | Цитировать Сообщить модератору
 Re: Изменение данных в другой базе данных на одном сервере в триггере.  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> В обоих базах данных есть пользователь MyDomain\MyUserName
>
> т.е.
> Имя пользователя = MyDomain\MyUserName
> Имя входа = MyDomain\MyUserName

и в обеих базах он запросы может выполнять?

Posted via ActualForum NNTP Server 1.5

15 мар 12, 16:14    [12254742]     Ответить | Цитировать Сообщить модератору
 Re: Изменение данных в другой базе данных на одном сервере в триггере.  [new]
Сергей1979
Member

Откуда:
Сообщений: 34
Да, к обоим спокойно любой запрос в т.ч. на создание объектов БД.


Добавил в триггер

EXECUTE AS LOGIN = MyDomain\MyUserName'
DELETE FROM MYSERVER.dbo.MyTable2
REVERT


Теперь ошибки нет, но данные в таблице YSERVER.dbo.MyTable2 не удалились.
15 мар 12, 16:21    [12254855]     Ответить | Цитировать Сообщить модератору
 Re: Изменение данных в другой базе данных на одном сервере в триггере.  [new]
Сергей1979
Member

Откуда:
Сообщений: 34
И что забавно

если я изменения в таблицу делаю из MS SQL Server Managment Studio то все в порядке, а вот из прилолжения данные в таблице не удаляются.
15 мар 12, 16:23    [12254884]     Ответить | Цитировать Сообщить модератору
 Re: Изменение данных в другой базе данных на одном сервере в триггере.  [new]
Сергей1979
Member

Откуда:
Сообщений: 34
В окне приложения при запуске стоит Windows Autentification
15 мар 12, 16:29    [12254965]     Ответить | Цитировать Сообщить модератору
 Re: Изменение данных в другой базе данных на одном сервере в триггере.  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Сергей1979
Да, к обоим спокойно любой запрос в т.ч. на создание объектов БД.


Добавил в триггер

EXECUTE AS LOGIN = MyDomain\MyUserName'
DELETE FROM MYSERVER.dbo.MyTable2
REVERT


Теперь ошибки нет, но данные в таблице YSERVER.dbo.MyTable2 не удалились.


читаю и не пойму: удаление прямо из базы с названием MyTable2?

DELETE FROM MYSERVER.dbo.MyTable2

а почему не так

DELETE FROM MYSERVER.dbo.моябаза.MyTable2
15 мар 12, 17:21    [12255624]     Ответить | Цитировать Сообщить модератору
 Re: Изменение данных в другой базе данных на одном сервере в триггере.  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Winnipuh
Сергей1979
Да, к обоим спокойно любой запрос в т.ч. на создание объектов БД.


Добавил в триггер

EXECUTE AS LOGIN = MyDomain\MyUserName'
DELETE FROM MYSERVER.dbo.MyTable2
REVERT


Теперь ошибки нет, но данные в таблице YSERVER.dbo.MyTable2 не удалились.


читаю и не пойму: удаление прямо из базы с названием MyTable2?

DELETE FROM MYSERVER.dbo.MyTable2

а почему не так

DELETE FROM MYSERVER.dbo.моябаза.MyTable2


точнее

DELETE FROM MYSERVER.моябаза.dbo.MyTable2
15 мар 12, 17:22    [12255632]     Ответить | Цитировать Сообщить модератору
 Re: Изменение данных в другой базе данных на одном сервере в триггере.  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
кроме того, не надо ли создавать линкед сервер для того, чтобы обращаться к нему по имени в
запросах с 4 частями в имени?
15 мар 12, 17:23    [12255645]     Ответить | Цитировать Сообщить модератору
 Re: Изменение данных в другой базе данных на одном сервере в триггере.  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Winnipuh
кроме того, не надо ли создавать линкед сервер для того, чтобы обращаться к нему по имени в
запросах с 4 частями в имени?
По-моему, если сервер один и тот же,
он автоматически преобразует имена в трёхкомпонентные.
15 мар 12, 17:41    [12255822]     Ответить | Цитировать Сообщить модератору
 Re: Изменение данных в другой базе данных на одном сервере в триггере.  [new]
Сергей1979
Member

Откуда:
Сообщений: 34
Извиняюсь.
Опечатка.

Правильно
MyServer.MyBase.MyTable


Вот это помогло не получать ошибку, но данные не удаляются все равно.

EXECUTE AS LOGIN = MyDomain\MyUserName'
DELETE FROM MYSERVER.MyBase.dbo.MyTable2
REVERT
15 мар 12, 19:13    [12256354]     Ответить | Цитировать Сообщить модератору
 Re: Изменение данных в другой базе данных на одном сервере в триггере.  [new]
Сергей1979
Member

Откуда:
Сообщений: 34
Создал пользователя www и добавил в обе базы

написал

EXECUTE AS USER = 'WWW'
DELETE FROM MYSERVER.MyBase.dbo.MyTable2
REVERT



Теперь такая же ошибка даже при срабаываении триггера при обновление данных в
MS SQL Server Managment Studio

Прошу прощения если гдето ошибаюсь в синтаксисе. Пишу по пямяти.
15 мар 12, 19:20    [12256381]     Ответить | Цитировать Сообщить модератору
 Re: Изменение данных в другой базе данных на одном сервере в триггере.  [new]
Ctrl-C
Guest
выполните следующее:

sp_configure 'cross db ownership chaining'


если ран валуе у вас не 1 то установите в 1

sp_configure 'cross db ownership chaining',1
reconfigure
15 мар 12, 20:07    [12256541]     Ответить | Цитировать Сообщить модератору
 Re: Изменение данных в другой базе данных на одном сервере в триггере.  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Сергей1979
Извиняюсь.
Опечатка.

Правильно
MyServer.MyBase.MyTable


Вот это помогло не получать ошибку, но данные не удаляются все равно.

EXECUTE AS LOGIN = MyDomain\MyUserName'
DELETE FROM MYSERVER.MyBase.dbo.MyTable2
REVERT


Правильно
MyServer.MyBase.МайСхема.MyTable
16 мар 12, 11:54    [12259041]     Ответить | Цитировать Сообщить модератору
 Re: Изменение данных в другой базе данных на одном сервере в триггере.  [new]
Сергей1979
Member

Откуда:
Сообщений: 34
Выполнил вот такое.

ALTER DATABASE MyBase SET DB_CHAINING ON

Теперь действительно ошибки не стало.

Но тело триггера не выполняется. И ошибки никакой нет. Т.е. данные в таблице не удаляются при срабатывании триггера.
16 мар 12, 13:07    [12259656]     Ответить | Цитировать Сообщить модератору
 Re: Изменение данных в другой базе данных на одном сервере в триггере.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Сергей1979
Но тело триггера не выполняется.

Вы это факт как установили ?
16 мар 12, 13:25    [12259818]     Ответить | Цитировать Сообщить модератору
 Re: Изменение данных в другой базе данных на одном сервере в триггере.  [new]
Сергей1979
Member

Откуда:
Сообщений: 34
написал там

print "Выполнился"
16 мар 12, 15:26    [12261066]     Ответить | Цитировать Сообщить модератору
 Re: Изменение данных в другой базе данных на одном сервере в триггере.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Сергей1979
написал там

print "Выполнился"

Триггер всегда срабатывает на событие, для которого он создан.
16 мар 12, 15:27    [12261081]     Ответить | Цитировать Сообщить модератору
 Re: Изменение данных в другой базе данных на одном сервере в триггере.  [new]
Сергей1979
Member

Откуда:
Сообщений: 34
Эксперимент

создал login = MyTestLogin
создал в обеих базах User = MyTestLogin

выполнил для обеих баз
ALTER DATABASE SET DB_CHAINING ON

Добавил в триггер

ALTER TRIGGER MyTrigger ON MyTable
with EXECUTE AS MyTestLogin
AFTER UPDATE,INSERT,DELETE

и теперь снова получаю ошику

Серверу-участнику "MyTestLogin" не удалось обратиться к базе данных "ITILEXT" в текущем контексте безопасности.
16 мар 12, 15:29    [12261094]     Ответить | Цитировать Сообщить модератору
 Re: Изменение данных в другой базе данных на одном сервере в триггере.  [new]
Диам
Member

Откуда:
Сообщений: 1442
Пусть и некропостинг, но может быть будет кому-нибудь полезен.
Для возможности обращения к другой базе данных от имени нетекущего пользователя (т.е. когда используется WITH EXECUTE AS ####) надо включить в базе данных параметр не DB_CHAINING (мне его включение не помогло), а TRUSTWORTHY (после этого триггеры, записывающие данные в другую базу, заработали даже когда процедура, вносящая изменения в таблицу запускается от имени другого пользователя)

Из справки:
+

Параметры внешнего доступа
Управляет возможностью доступа к базе данных со стороны внешних ресурсов (например, объектов из другой базы данных).

DB_CHAINING
Если указано значение ON, то база данных может быть источником или целевой базой данных в межбазовой цепочке владения.
Если указано значение OFF, база данных не может участвовать в межбазовых цепочках владения.
по умолчанию OFF

TRUSTWORTHY
Если указано значение ON, модули базы данных (например, пользовательские функции или хранимые процедуры), использующие контекст олицетворения, могут получать доступ к ресурсам, расположенным вне базы данных.
Если указано значение OFF, контекст олицетворения не имеет доступа к ресурсам вне базы данных.

Параметр TRUSTWORTHY устанавливается в OFF при каждом присоединении базы данных.
по умолчанию OFF
12 янв 13, 01:14    [13757975]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить