Вставка в другую базу данных с использованием роли триггера и приложения

#sql #sql-server #triggers #insert #application-role

Вопрос:

В настоящее время я испытываю проблему с реализацией триггера на сервере базы данных SQL Server 2019.

У меня есть триггер в таблице A1 базы данных DB_A, он должен выполнять вставку в таблицу B1 базы данных DB_B, когда данные вставляются в таблицу A1 базы данных DB_A.

Обе базы данных находятся в одном экземпляре.

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

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

Msg 916, Уровень 14, Состояние 2, Процедура XXX, Строка 6 [Строка 1 Начала Пакета]
Основной сервер «XXXX» не может получить доступ к базе данных «XXX» в текущем контексте безопасности.

База данных DB1 имеет роль приложения, которая имеет права только на эту базу данных, я знаю, что роли приложений имеют область действия только на уровне базы данных, я также знаю, что я не могу сопоставить роль приложения с другой базой данных, но как мне решить эту проблему доступа между базами данных этого же экземпляра?

Комментарии:

1. Несколько идей: 1. Предоставьте приложению доступ к другой базе данных. 2. Используйте цепочку владения базой данных (это сопровождается многими предостережениями!). 3. Подпишите свой триггер сертификатом, который имеет разрешения в другой базе данных. 4. Вместо этого используйте процедуру для обработки рабочей нагрузки и вместо этого подпишите ее. 5. Переосмыслите свой дизайн и не используйте триггер.

Ответ №1:

Вы должны предоставить роли для обеих баз данных пользователю, только тогда вы сможете вставлять данные в обе базы данных