Вдохновленный различными вопросами, связанными с схемой, которые я видел...
Цепочка прав собственности позволяет мне использовать EXECUTE в хранимой процедуре без явных разрешений на таблицы, которые я использую, если обе хранимые процедуры и таблицы находятся в та же схема.
Если мы используем отдельные схемы, мне нужно будет явно указать GRANT XXX в таблицах разных схем. Этот пример демонстрирует пример цепной привязки. Это означает, что хранимый исполняющий процесс proc пользователь может напрямую читать/записывать ваши таблицы.
Это будет похоже на прямой доступ к вашим переменным экземпляра в классе, минуя getter/seters, прерывая инкапсуляцию.
Мы также используем безопасность на уровне строк, чтобы ограничить то, что кто-то видит, и применяем это в хранимых процедурах.
Итак, как мы можем поддерживать разделение схемы и предотвращать прямой доступ к таблице?
Конечно, вопрос не будет применяться, если вы используете ORM или не используете хранимые процедуры. Но я не спрашиваю, должен ли я использовать ORM или хранимую процедуру на случай, если кто-то почувствует необходимость просветить меня...
Изменить, пример
CREATE USER OwnsMultiSchema WITHOUT LOGIN
GO
CREATE SCHEMA MultiSchema1 AUTHORIZATION OwnsMultiSchema
GO
CREATE SCHEMA MultiSchema2 AUTHORIZATION OwnsMultiSchema
GO
CREATE USER OwnsOtherSchema WITHOUT LOGIN
GO
CREATE SCHEMA OtherSchema AUTHORIZATION OwnsOtherSchema
GO
CREATE TABLE MultiSchema1.T1 (foo int)
GO
CREATE TABLE MultiSchema2.T2 (foo int)
GO
CREATE TABLE OtherSchema.TA (foo int)
GO
CREATE PROC MultiSchema1.P1
AS
SELECT * FROM MultiSchema1.T1
SELECT * FROM MultiSchema2.T2
SELECT * FROM OtherSchema.TA
Go
EXEC AS USER = 'OwnsMultiSchema'
GO
--gives error on OtherSchema
EXEC MultiSchema1.P1
GO
REVERT
GO
CREATE PROC OtherSchema.PA
AS
SELECT * FROM MultiSchema1.T1
SELECT * FROM MultiSchema2.T2
SELECT * FROM OtherSchema.TA
Go
GRANT EXEC ON OtherSchema.PA TO OwnsMultiSchema
GO
EXEC AS USER = 'OwnsMultiSchema'
GO
--works
EXEC OtherSchema.PA
GO
REVERT
GO
Изменить 2:
- Мы не используем "привязку к базе данных с перекрестными базами данных"
- Безопасность уровня строки - это красная селедка и не имеет значения: мы не используем ее везде