Ken*_*her 6 schema security sql-server
SQL Server 用户的设置之一是DEFAULT_SCHEMA. 这是经常dbo但并非总是如此。我意识到您可以使用以下代码更改设置:
ALTER USER [UserName] WITH DEFAULT_SCHEMA = [SchemaName]
Run Code Online (Sandbox Code Playgroud)
据我所知,无论何时我创建 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;
Run Code Online (Sandbox Code Playgroud)