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

9

В SQL Server у меня есть пользователь в определенной базе данных, и меня попросили предоставить ему доступ только ко всем несистемным представлениям базы данных. Я полагаю, что это можно сделать, отредактировав защищаемые формы представления типа и предоставив select для каждого из них, но существует множество представлений. Есть ли более эффективный способ сделать это?

Кристофер Гарсия
источник

Ответы:

8

Там нет синтаксиса, такого как

GRANT SELECT ON ALL::Views TO SomeUser 

Вы можете GRANT SELECTразрешать отдельные объекты , схемы или всю базу данных, но не фильтровать по типу объекта, чтобы включить только представления. Для такой задачи adhoc я бы, вероятно, создал новую роль с именем ViewReader, добавил бы пользователя к этой роли, а затем в SSMS запустите

SELECT 'GRANT SELECT ON ' + 
          QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(name) + 
      ' TO ViewReader;'
FROM sys.views
WHERE is_ms_shipped = 0

создать скрипт для запуска с GRANTнеобходимыми разрешениями.

Мартин Смит
источник
Спасибо за чрезвычайно изящный ответ. Сценарий чуть-чуть у меня над головой, поэтому я немного прочту, прежде чем пытаться его реализовать. Еще раз спасибо.
Кристофер Гарсия
1
@lush - скрипт просто дает вам несколько команд для просмотра, копирования, вставки и запуска. Вы могли бы сделать что-то более сложное, чтобы объединить результат, EXECно я бы не стал беспокоиться об одноразовой задаче.
Мартин Смит
Теперь я понимаю, что это идеальное решение для этой проблемы, спасибо!
Кристофер Гарсия
4

Я взял другой подход в моем случае. Вот что я сделал:

  1. Создайте логин и сопоставьте его с базой данных.
  2. Перейдите в базу данных и создайте схему под названием Public_View, например. Владелец этой схемы должен быть тем же владельцем таблиц, на которые будут ссылаться представления.
  3. Предоставьте новому пользователю доступ к новой схеме.
  4. Создайте столько представлений, сколько вы хотите в новой схеме, и новый пользователь получит к ним доступ.

Хорошо, что новый пользователь не будет иметь доступа к таблицам, он даже не сможет их видеть.

Я надеюсь, что это помогает.

Франсиско Гольденштейн
источник
4
+1 Для меня хорошо то, что в этом решении, по сравнению с моим, нет необходимости явно назначать разрешения при создании новых представлений.
Мартин Смит