Мне нужно ограничить доступ для конкретного пользователя, но он все еще должен иметь возможность видеть данные в таблицах, принадлежащих dbo.
Я пытаюсь сделать следующее:
- Схема dbo функционирует как обычно, имеет доступ ко всему
- Схема1 имеет доступ только к объектам схемы1.
- если представление схемы или хранимая процедура обращается к данным в таблицах, принадлежащих dbo, цепочка разрешений соответственно
- user1 имеет доступ к schema1 и больше ничего; за исключением случая № 3
Вот что я попробовал:
- Создайте пользователя user1, сопоставленного с тестовым логином со случайным паролем
- Создал пару таблиц в схеме dbo с некоторыми тестовыми данными в них
- Создана схема schema1
- Создал schema1.get_profiles, который выбирает из представления с именем schema1.profiles, которое обращается к данным в dbo.people, dbo.taglinks и dbo.tags
Тем не менее, используя следующий оператор при входе в систему как user1:
EXEC get_profiles 1
результаты в:
The SELECT permission was denied on the object 'tags', database 'schema_test', schema 'dbo'.
Я пытался WITH EXECUTE AS OWNER
и не могу понять, как «цепочка владения» должна работать.
Я также пытался
GRANT EXECUTE ON SCHEMA::schema1 TO user1
GRANT INSERT ON SCHEMA::schema1 TO user1
GRANT SELECT ON SCHEMA::schema1 TO user1
GRANT UPDATE ON SCHEMA::schema1 TO user1
GRANT VIEW DEFINITION ON SCHEMA::schema1 TO user1
но я получаю следующую ошибку (несмотря на то, что пользователь с уровнем доступа dbo):
Cannot grant, deny, or revoke permissions to sa, dbo, entity owner, information_schema, sys, or yourself.
Что мне нужно, так это user1, чтобы иметь возможность доступа к данным через хранимые процедуры, которые я им предоставляю, и ничего больше
Кроме того, это в конечном итоге предназначено для использования в существующей базе данных SQL Azure, но сначала я проверяю локальную фиктивную базу данных.
источник
Ответы:
Основная концепция заключается в использовании разрешений схемы GRANT / DENY . Вы можете эффективно управлять разрешениями, создав роль и добавив в нее участников.
Ниже приведен пример, который подробно объяснит вам
Сейчас тестируем:
Теперь создайте хранимые процедуры:
Теперь предоставьте права на выполнение UserA на SP схемы ScheB.
Проверьте это .., чтобы увидеть, может ли UserA запускать SP из schemaB. Это пройдет
Но UserA не сможет увидеть данные из SchemaB
В качестве альтернативы вы можете использовать DATABASE ROLE и просто добавить к ней пользователей для лучшей управляемости разрешений:
Нижеприведенный оператор убедится, что UserA может видеть schemaA, а НЕ schemaB. Хорошо, что вы можете просто добавить пользователей к
SchemaBUsesSchemaAProc
роли, и они унаследуют все разрешения, предоставленные этой роли.Если вы хотите, чтобы UserA мог выполнять SP, принадлежащие SchemaB, то нижеприведенный оператор выполнит эту работу:
Таким образом, UserA не может видеть таблицы SchemaB, но все же может выполнять процессы из SchemaB.
Ниже поясняется иерархия разрешений :
источник