Боюсь, что либо ваше описание, либо ваша концепция цепочки владения неясны, поэтому позвольте мне начать с этого:
«Цепочка владения» просто означает тот факт, что при выполнении хранимой процедуры (или представления) на SQL Server текущая исполняемая партия временно получает права / разрешения Владельца sProc (или Владельца схемы sProc) при выполнении этого Код SQL Таким образом, в случае sProc, Пользователь не может использовать эти привилегии для того, чтобы сделать что-то, что код sProc не реализует для них. Обратите внимание, что он никогда не приобретает Идентичность Владельца, только его права, временно (однако, EXECUTE AS ... делает это).
Таким образом, типичный подход для обеспечения безопасности:
Поместите все таблицы данных (и все представления, не связанные с безопасностью) в их собственную схему, назовем ее [data] (хотя обычно используется [dbo], потому что она уже существует и слишком привилегирована для Схема пользователя). Убедитесь, что ни один из существующих пользователей, схем или владельцев не имеет доступа к этой схеме [данных].
Создайте схему с именем [exec] для всех sProcs (и / или, возможно, любых представлений безопасности). Убедитесь, что владелец этой схемы имеет доступ к схеме [data] (это легко сделать, если вы сделаете dbo владельцем этой схемы).
Создайте новую роль БД с именем «Пользователи» и предоставьте ей EXECUTE доступ к схеме [exec]. Теперь добавьте всех пользователей к этой роли. Убедитесь, что ваши пользователи имеют только права Connect и не имеют доступа к какой-либо другой схеме, включая [dbo].
Теперь ваши пользователи могут получить доступ к данным, только выполнив sProcs в [exec]. Они не могут получить доступ к каким-либо другим данным или выполнять любые другие объекты.
Я не уверен, что это отвечает на ваш вопрос (потому что я не был уверен, что именно был вопрос), поэтому не стесняйтесь перенаправить меня.
Что касается безопасности на уровне строк, вот как я всегда делаю это со схемой безопасности выше:
Я всегда реализую безопасность на уровне строк как серию представлений, которые зеркально обтягивают каждую таблицу и сравнивают личность пользователя (обычно с Suser_Sname () или одним из других) со списком безопасности, введенным из кода безопасности в самом ряду. Это Security-Views.
Создайте новую схему под названием [rows], предоставьте ее владельцу доступ к схеме [data] и ничего больше. Поместите все Security-Views в эту схему.
Отменить доступ владельца [exec] к схеме [data] и вместо этого предоставить ему доступ к данным к схеме [lines].
Готово. Теперь защита на уровне строк была реализована путем прозрачного помещения ее между sProcs и таблицами.
Наконец, вот хранимая заготовка, которую я использую, чтобы помочь мне вспомнить, сколько из этого неясного средства безопасности работает и взаимодействует с самим собой ( упс, исправленная версия кода ):
CREATE proc [TestCnxOnly].[spShowProc_Security_NoEX] as
--no "With Execute as Owner" for this version
--create User [UserNoLogin] without login
--Grant connect on database :: TestSecurity to Guest
--alter database TestSecurity set trustworthy on
--Show current user context:
select current_user as current_
, session_user as session
, user_name() as _name
, suser_name() as [suser (sproc)]
, suser_sname() as sname
, system_user as system_
--Execute As Login = 'UserNoLogin'
select current_user as current_
, session_user as session
, user_name() as _name
, suser_name() as [suser (after exec as)]
, suser_sname() as sname
, system_user as system_
EXEC('select current_user as current_
, session_user as session
, user_name() as _name
, suser_name() as [suser (in Exec(sql))]
, suser_sname() as sname
, system_user as system_')
EXEC sp_ExecuteSQL N'select current_user as current_
, session_user as session
, user_name() as _name
, suser_name() as [suser (in sp_Executesql)]
, suser_sname() as sname
, system_user as system_'
--Revert
select current_user as current_
, session_user as session
, user_name() as _name
, suser_name() as [suser (aftr revert)]
, suser_sname() as sname
, system_user as system_
[РЕДАКТИРОВАТЬ: исправленная версия кода)