Как GRANT EXECUTE и ссылка на кросс-базу данных работают в SQL Server?

У меня есть 2 базы данных, назовем их Database1 и Database2, пользователь с очень ограниченными правами, назовем его User1, и хранимая процедура в Database1, назовем ее Proc1.

Я даю разрешение EXECUTE пользователю User1 на Proc1; GRANT EXECUTE ON [dbo].[Proc1] TO [User1] и все работало нормально, пока все таблицы, на которые ссылаются (для SELECT, UPDATE... и т. д.), находятся в Database1, хотя User1 не имеет явных разрешений на эти таблицы. столы.

Я изменил Proc1 на SELECT из таблицы, назовем ее Table1, в Database2. Теперь, когда я выполняю Proc1, я получаю следующую ошибку: Разрешение SELECT было отклонено для объекта «Таблица1», база данных «База данных2», схема «dbo».

Насколько я понимаю, SQL Server позаботится о необходимых разрешениях, когда я предоставлю EXECUTE хранимой процедуре; это работает по-другому, когда таблица (или объект) находится в другой базе данных?

Примечания:

  • Пользователь 1 — это пользователь в обеих базах данных с одинаковыми ограниченными разрешениями.
  • Я использую SQL Server 2005

person TheBlueSky    schedule 01.10.2013    source источник
comment
Пользователь может иметь разрешения на создание объектов в одной базе данных и не иметь разрешений на другую. Должны ли они быть в состоянии обойти это, просто создав хранимую процедуру в своей собственной базе данных и выполнив ее?   -  person Damien_The_Unbeliever    schedule 01.10.2013
comment
Это будет не так просто. Я думаю, что статья, на которую ссылается Шимон (ответ), резюмировала это лучше.   -  person TheBlueSky    schedule 01.10.2013


Ответы (4)


Кажется, есть разница, когда SQL Server проверяет разрешения в цепочке разрешений. Конкретно:

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

(Источник: http://msdn.microsoft.com/en-us/library/ms188676.aspx)

person Szymon    schedule 01.10.2013

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

... Чтобы пользователь мог запустить эту процедуру без разрешения SELECT для testtbl, вам необходимо выполнить следующие четыре шага:

1.Создайте сертификат.

2.Создайте пользователя, связанного с этим сертификатом.

3. Предоставьте этому пользователю права SELECT на testtbl.

4. Подпишите процедуру сертификатом каждый раз, когда вы меняете процедуру.

При вызове процедуры права пользователя сертификата добавляются к правам фактического пользователя. ...

(из http://www.sommarskog.se/grantperm.html#Certificates)

Дополнительная документация также доступна в MSDN.

person Rozwel    schedule 15.01.2015

Убедитесь, что пользователь действительно один и тот же в обеих базах данных. Не просто НАЗВАТЬ то же самое. Попробуйте удалить пользователя из обеих баз данных, затем создайте пользователя под пользователями SERVER и назначьте соответствующие разрешения для каждой базы данных из этой учетной записи одного пользователя.

person Reiff L    schedule 10.04.2017

Чтобы расширить ответ @Szymon с обновленным текстом от Microsoft в конце 2018 года:

Цепочка владения между базами данных по умолчанию отключена. Корпорация Майкрософт рекомендует отключить цепочку владения несколькими базами данных, поскольку она подвергает вас следующим рискам безопасности:

  • Владельцы базы данных и члены ролей базы данных db_ddladmin или db_owners могут создавать объекты, принадлежащие другим пользователям. Эти объекты потенциально могут быть нацелены на объекты в других базах данных. Это означает, что если вы включите цепочку владения несколькими базами данных, вы должны полностью доверять этим пользователям данные во всех базах данных.

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

Также упоминается о динамическом SQL и подписи сертификатов для таких процедур, как упоминает @Rozwel в своем ответе.

(Источник: https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/enabling-cross-database-access-in-sql-server)

person fujiiface    schedule 28.12.2018