Цепочка владения хранимой процедурой - PullRequest
2 голосов
/ 29 сентября 2008

У меня есть несколько хранимых процедур в моей базе данных, которые используются для загрузки данных из 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 в обеих базах данных. Это позволяет ограничить цепочку владения между двумя базами данных, не прибегая к полной цепочке владения базой данных.

Ответы [ 3 ]

2 голосов
/ 29 сентября 2008

Почему бы не удалить EXECUTE AS OWNER?

Обычно мой пользователь, выполняющий SP, имеет соответствующие права в обеих базах данных, и мне совсем не нужно этого делать.

1 голос
/ 18 февраля 2011

Нет необходимости создавать логин, вы можете просто включить гостевого пользователя в целевой БД.

Грант подключиться к гостю

Это позволяет исполнительному пользователю войти в БД в гостевом контексте, и когда "цепочка БД включена, доступ не будет проверяться в целевой БД.

0 голосов
/ 01 октября 2008

На самом деле, DBO - это роль (вы можете рассматривать ее как группу пользователей), а не сам по себе пользователь. (Если вы не можете подключиться к SQL SERVER с помощью dbo: passwordfordbo, это не пользователь).

Обычно в прекрасном мире SQL Server, если вы предоставляете пользователю X право на выполнение сохраненной процедуры, тогда Х получает право на выполнение всей задачи, содержащейся в Y, даже если он не имеет всех прав на все объекты, используемые в Y .

Это чрезвычайно полезная функция для инкапсуляции бизнес-логики в хранимой процедуре. (У вашего пользователя НЕТ доступа к таблице, но он может ВЫПОЛНИТЬ один сохраненный процесс).

Когда мы говорим о «цепочке владения», это означает следующее (пожалуйста, поправьте меня, если я ошибаюсь) - Если цепочка владения отключена: право на выполнение процедуры X будет действовать, пока все необходимые объекты находятся в одной базе данных. - Включена цепочка: эта «привилегия» распространяется на все базы данных.

Надеюсь, это поможет,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...