使用者 DEFAULT_SCHEMA 如何設置為“dbo”以外的其他內容
SQL Server 使用者的設置之一是
DEFAULT_SCHEMA
. 這經常發生dbo
,但並非總是如此。我意識到您可以使用以下程式碼更改設置:ALTER USER [UserName] WITH DEFAULT_SCHEMA = [SchemaName]
據我所知,每當我創建 a
USER
並且不指定DEFAULT_SCHEMA
它使用的 a 時dbo
。但我仍然發現USERS
它具有不同的預設架構。如果我沒記錯的話,當您有一個從 SQL 2000 升級的實例時,預設架構是與使用者名匹配的架構。我猜這就是我所看到的大部分(如果不是全部)的來源。
有沒有其他方法可以在
USER
不指定的情況下創建 aDEFAULT_SCHEMA
並使用除 之外的其他內容創建它dbo
?注意:這適用於 SQL Server 2005 及更高版本。
發生這種情況的一種方法是讓具有
CONTROL SERVER
伺服器級別權限的登錄名(因此不需要實際USER
才能訪問數據庫)但不是sysadmin
固定伺服器角色(因為這樣有一個隱含的預設模式dbo
)創建一個沒有明確指定要放入的模式的對象。根據CREATE SCHEMA的 MSDN 頁面:
隱式模式和使用者創建
在某些情況下,使用者可以在沒有數據庫使用者帳戶(數據庫中的數據庫主體)的情況下使用數據庫。這可能發生在以下情況:
- 登錄具有CONTROL SERVER權限。
- Windows 使用者沒有單獨的數據庫使用者帳戶(數據庫中的數據庫主體),但作為具有數據庫使用者帳戶(Windows 組的數據庫主體)的 Windows 組的成員訪問數據庫。
當沒有數據庫使用者帳戶的使用者在未指定現有架構的情況下創建對象時,將在數據庫中為該使用者自動創建數據庫主體和預設架構。創建的數據庫主體和架構將與使用者在連接到 SQL Server 時使用的名稱(SQL Server 身份驗證登錄名或 Windows 使用者名)具有相同的名稱。
因此,我說的是上面提到的第一種情況,@Max 的回答是關於第二種情況。
以下是第一種情況的範例(請注意,以下範例使用
tempdb
,因為每個實例都有,但我確實在非tempdb
數據庫上進行了測試)。要查看第二種情況的範例,請參閱@Max 的答案(此處無需複制)。USE [master]; CREATE LOGIN [DefaultSchemaTest] WITH PASSWORD = 'DefaultSchemaTest'; GRANT CONTROL SERVER TO [DefaultSchemaTest]; GO EXECUTE AS LOGIN = 'DefaultSchemaTest'; USE [tempdb]; SELECT * FROM sys.database_principals WHERE [type] <> 'R'; SELECT * FROM sys.schemas WHERE [name] NOT LIKE N'db[_]%'; CREATE TABLE MySchemaTest (Col1 INT); SELECT * FROM sys.database_principals WHERE [type] <> 'R'; SELECT * FROM sys.schemas WHERE [name] NOT LIKE N'db[_]%'; USE [master]; REVERT;