发生这种情况的一种方法是使具有CONTROL SERVER服务器级权限的登录(因此不需要实际的USER以访问数据库),而不是sysadmin固定服务器角色(因为这是隐含的默认模式) (dbo)创建一个对象而不显式指定要放入的模式.
Implicit Schema and User Creation
In some cases a user can use a database without having a database user account (a database principal in the database). This can happen in the following situations:
A login has CONTROL SERVER privileges.
A Windows user does not have an individual database user account (a database principal in the database), but accesses a database as a member of a Windows group which has a database user account (a database principal for the Windows group).
When a user without a database user account creates an object without specifying an existing schema, a database principal and default schema will be automatically created in the database for that user. The created database principal and schema will have the same name as the name that user used when connecting to SQL Server (the SQL Server authentication login name or the Windows user name).
因此,我说的是上面提到的第一个案例,@ Max的回答是关于第二个案例.
以下是第一种情况的示例(请注意,以下示例使用tempdb,因为每个实例都有,但我确实在非tempdb数据库上进行了测试以确保).要查看第二种情况的示例,请参阅@ Max的answer(此处无需复制).
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;