Sql-Server

使用者 DEFAULT_SCHEMA 如何設置為“dbo”以外的其他內容

  • April 1, 2016

SQL Server 使用者的設置之一是DEFAULT_SCHEMA. 這經常發生dbo,但並非總是如此。我意識到您可以使用以下程式碼更改設置:

ALTER USER [UserName] WITH DEFAULT_SCHEMA = [SchemaName]

據我所知,每當我創建 aUSER並且不指定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;

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