Sql-Server

創建一個以呼叫使用者為所有者的序列

  • July 31, 2021

背景

我有一個具有以下權限的 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) 擁有它創建的序列,而不需要更高級別的使用者來轉移所有權?

授予 SequenceCreatorseq架構的所有權。

alter authorization on schema::seq to SequenceCreator

除了解決這個問題之外,對像不屬於其架構所有者的*情況極為罕見。*許多人和工具甚至不知道這是可能的。所以最好避免單獨的對象所有權。

此外,允許非管理員使用者在dbo. 序列可能是無害的,但表、視圖或過程將允許使用者提升權限。

引用自:https://dba.stackexchange.com/questions/297411