Sql-Server
創建一個以呼叫使用者為所有者的序列
背景
我有一個具有以下權限的 SQL 使用者:
GRANT CREATE SEQUENCE ON SCHEMA::seq TO SequenceCreator GO
我希望能夠讓這個使用者創建一個它擁有的序列。但是當我執行以下命令時:
EXECUTE AS USER = 'SequenceCreator' CREATE SEQUENCE seq.Testing START WITH 1 INCREMENT BY 1 NO CACHE REVERT
所有者是
dbo
,繼承自架構。如以下查詢所示:;with objects_cte as ( select o.name, o.type_desc, case when o.principal_id is null then s.principal_id else o.principal_id end as principal_id from sys.objects o INNER join sys.schemas s ON o.schema_id = s.schema_id ) select cte.name, dp.name AS owner from objects_cte cte JOIN sys.database_principals dp ON cte.principal_id = dp.principal_id WHERE cte.name = 'Testing'
結果:
name name Testing dbo
但是當我(as
dbo
)執行這個時:ALTER AUTHORIZATION ON seq.[Test--Things] TO SequenceCreator
然後該查詢的結果變為:
name owner Testing SequenceCreator
但是如果我放棄序列並執行它:
EXECUTE AS USER = 'SequenceCreator' CREATE SEQUENCE seq.Testing START WITH 1 INCREMENT BY 1 NO CACHE ALTER AUTHORIZATION ON seq.[Testing] TO SequenceCreator REVERT
我收到以下錯誤:
Cannot find the object 'Testing', because it does not exist or you do not have permission.
這是意料之中的,因為使用者
SequenceCreator
沒有看到更少alter
序列的權限。但似乎,既然使用者正在創建它,它也應該能夠設置誰擁有它。(類似於
CREATE SCHEMA seq AUTHORIZATION dbo
通話)問題
如何讓創建使用者 (
SequenceCreator
) 擁有它創建的序列,而無需更高級別的使用者轉移所有權?
但似乎,既然使用者正在創建它,它也應該能夠設置誰擁有它。
絕對不。創建後,對象歸模式所有者所有,如果允許使用者獲取 DBO 對象的所有權,這將是一個安全漏洞。
如何讓創建使用者 (SequenceCreator) 擁有它創建的序列,而不需要更高級別的使用者來轉移所有權?
授予 SequenceCreator
seq
架構的所有權。alter authorization on schema::seq to SequenceCreator
除了解決這個問題之外,對像不屬於其架構所有者的*情況極為罕見。*許多人和工具甚至不知道這是可能的。所以最好避免單獨的對象所有權。
此外,允許非管理員使用者在
dbo
. 序列可能是無害的,但表、視圖或過程將允許使用者提升權限。