Вдохновленный различные вопросы, связанные схемы, которые я видел ...SQL Server: как разрешить схемы?
Ownership chaining позволяет мне GRANT EXECUTE на хранимую процедуру без явного разрешения на таблицах, которые я использую, если оба хранимые процедуры и таблицы находятся в одной и той же схеме.
Если мы используем отдельные схемы, тогда я должен явно указать GRANT XXX в таблицах разных схем. Этот пример демонстрирует пример цепной привязки. Это означает, что сохраненный исполняющий процесс proc пользователь может напрямую читать/писать ваши таблицы.
Это будет иметь прямой доступ к вашим переменным экземпляра в классе, минуя геттер/сеттеры, прерывая инкапсуляцию.
Мы также используем безопасность на уровне строк, чтобы ограничить то, что кто-то видит, и применяем это в хранимых процедурах.
Итак, как мы можем поддерживать разделение схемы и предотвращать прямой доступ к таблице?
Конечно, вопрос не будет применяться, если вы используете ORM или не используете хранимые процедуры. Но я не с просьбой, если я должен использовать ОРМ или хранимую процедуру в случае, если кто-то чувствует необходимость просветить меня ...
Edit, пример
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
Edit 2:
- мы не используем «перекрестного владения базами данных цепочки»
- Роу уровень безопасности является отвлекающим маневром и не имеет значения: мы не используем его везде
Возможно ли, чтобы вы указали кодированный пример сценария отдельной схемы, который вы описываете для ясности, пожалуйста? В вашем сценарии, имеют ли две отдельные схемы один и тот же владелец? –
Зачем голосовать за serverfault? Это для кодовых обезьян, а не системных администраторов ... – gbn
@ Джон Сансом: да, я это сделаю. – gbn