Sql-Server

如何檢查 WINDOWS_GROUP 的預設架構?

  • July 17, 2018

我正在使用以下查詢來檢查預設架構是否設置為dbo.

SELECT DB_NAME() AS [database] 
     ,[name]
     ,[type_desc]
     ,[default_schema_name]
FROM [sys].[database_principals]
WHERE [type] IN ('U', 'G')
   --AND [default_schema_name] <> 'dbo';

如果未設置為dbo並且有人在未指定架構標識符的情況下創建了一個對象,schema則會使用他/她的 Windows 憑據創建一個新對象。

因此,我想編寫一個腳本來檢查(在特定時間段內)是否一切都設置好(因為每天都會恢復/創建新機器和數據庫)。

上面腳本的問題是我可以看到我的使用者的預設架構不是dbo,但是當使用其他帳戶執行時,我的使用者沒有列出。

我想那是因為WINDOWS_GROUP我們都是其中的一員,所以我需要檢查它的設置,但總是NULL為團體獲得價值。

如何檢查 WINDOWS_GROUP 的預設架構

可以用你的腳本default schema檢查。group

當此腳本顯示NULL為一個組時,這意味著default schema沒有為該組明確設置。

but when executed with other account, my user is not listed

這意味著 thisaccount沒有顯式映射到此數據庫,但它是一個或多個Windows groups映射的成員。

這裡的規則是:

如果使用者有預設架構,則將使用該預設架構。如果使用者沒有預設架構,但使用者是具有預設架構的組的成員,則將使用該組的預設架構。如果使用者沒有預設架構,並且是多個組的成員,則使用者的預設架構將是具有最低 principal_id 和顯式設置預設架構的 Windows 組的架構。

當你看到那個

有人在未指定架構標識符的情況下創建對象,則使用他/她的 Windows 憑據創建新架構

這意味著該使用者是一個或多個 Windows 組的成員,並且這些組都沒有預設架構。

如果你想阻止這種“模式創建”,你不應該讓使用者Windows groups沒有default schema,只需將dbo模式分配給dbo

alter user [someDomain\someGroup] with default_schema = dbo

要檢查映射到此數據庫的使用者組,請執行以下程式碼:

select *
from sys.user_token
where principal_id > 0

您可以在此處type = 'WINDOWS GROUP'過濾,但在未過濾時,您會看到所有令牌,因此如果您沒有看到 Windows 帳戶,那是因為它沒有顯式映射到該數據庫,而是通過 Windows 組到達數據庫

更新

此處呼叫implicit schema creation並記錄了此行為: CREATE SCHEMA (Transact-SQL)

隱式模式和使用者創建

在某些情況下,使用者可以在沒有數據庫使用者帳戶(數據庫中的數據庫主體)的情況下使用數據庫。這可能發生在以下情況:

登錄具有 CONTROL SERVER 權限。

Windows 使用者沒有單獨的數據庫使用者帳戶(數據庫中的數據庫主體),但作為具有數據庫使用者帳戶(Windows 組的數據庫主體)的 Windows 組的成員訪問數據庫。

當沒有數據庫使用者帳戶的使用者在未指定現有架構的情況下創建對象時,將在數據庫中為該使用者自動創建數據庫主體和預設架構。創建的數據庫主體和架構將與使用者在連接到 SQL Server 時使用的名稱(SQL Server 身份驗證登錄名或 Windows 使用者名)具有相同的名稱。

此行為對於允許基於 Windows 組的使用者創建和擁有對像是必要的。但是,它可能會導致無意創建模式和使用者。為避免隱式創建使用者和架構,請盡可能顯式創建數據庫主體並分配預設架構。或者,在數據庫中創建對象時,使用兩部分或三部分對象名稱顯式聲明現有模式。

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