У меня есть несколько хранимых процедур в моей базе данных, которые используются для загрузки данных из datamart, который размещен в отдельной базе данных. Эти процедуры, как правило, имеют вид:
CREATE PROCEDURE load_stuff
WITH EXECUTE AS OWNER AS
INSERT INTO my_db.dbo.report_table
(
column_a
)
SELECT
column_b
FROM data_mart.dbo.source_table
WHERE
foo = 'bar';
Они работают нормально, когда я выполняю запрос в SQL Server Management Studio. Когда я пытаюсь выполнить их с помощью EXEC load_stuff, процедура завершается неудачно с предупреждением безопасности:
Участник сервера "the_user" не может получить доступ к базе данных "data_mart" в текущем контексте безопасности.
ВЛАДЕЛЕЦ sproc - dbo, то есть the_user (для нашего примера). ВЛАДЕЛЕЦ обеих баз данных также является the_user, а the_user сопоставлен с dbo (что и должен делать SQL Server).
Почему я вижу эту ошибку в SQL Server? Это связано с тем, что для данного пользователя используется псевдоним dbo, и я должен использовать другую учетную запись для доступа к данным из нескольких баз данных?
Редактировать
Я понимаю, что это связано с тем, что SQL Server по умолчанию отключает перекрестное владение базой данных, что хорошо. Однако я не уверен в лучшей практике в этой ситуации. Если у кого-либо есть какие-либо сведения о наилучшей практике для этого сценария, это будет с благодарностью.
Редактировать 2
Конечным решением было установить TRUSTWORTHY ON в обеих базах данных. Это позволяет ограничить цепочку владения между двумя базами данных, не прибегая к полной цепочке владения базой данных.