适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Azure Synapse Analytics
Analytics Platform System (PDW)
Microsoft Fabric SQL 数据库
SQL Server 安全性的核心概念是对象的所有者具有管理这些对象的不可撤消的权限。 你不能删除对象所有者的特权,并且如果用户在数据库中拥有对象,你也不能将用户从此数据库中删除。
用户架构分离
通过用户架构分离,可实现管理数据库对象权限的更大灵活性。 架构是一个适用于数据库对象的命名容器,它使你能够将对象分组到单独的命名空间中。 例如,AdventureWorks 示例数据库包含 Production、Sales 和 HumanResources 的架构。
用于引用对象的由四部分组成的命名语法指定架构名称。
Server.Database.DatabaseSchema.DatabaseObject
架构所有者和权限
任何数据库主体都可以拥有架构,并且一个主体可拥有多个架构。 您可以对架构应用安全规则,安全规则将由架构中的所有对象继承。 如果设置了对架构的访问权限,则当新对象添加到架构时,新对象会自动应用这些权限。 可以为用户分配一个默认的架构,且多个数据库用户可以共享同一架构。
默认情况下,当开发人员在架构中创建对象时,该对象由拥有架构的安全主体而不是开发人员拥有。 可以使用 ALTER AUTHORIZATION Transact-SQL 语句转移对象所有权。 尽管架构还可以包含由不同用户拥有的对象并且这些对象具有比分配给架构的权限更加细化的权限,但因为架构会增大管理权限的复杂度,因此不建议使用。 对象可以在架构之间移动,架构所有权也可以在主体之间转移。 可以在不影响架构的情况下删除数据库用户。
实现后向兼容性的内置架构
SQL Server 随附 9 个预定义架构,这些架构的名称与内置数据库用户和角色的名称相同:db_accessadmin、db_backupoperator、db_datareader、db_datawriter、db_ddladmin、db_denydatareader、db_denydatawriter、db_owner 和 db_securityadmin。 这些架构用于实现后向兼容性。 建议不要将它们用于用户对象。 可以删除与固定数据库角色具有相同名称的架构,除非它们已经在使用中,在这种情况下,drop 命令会返回错误并阻止删除已使用的架构。
IF EXISTS (SELECT * FROM sys.schemas WHERE name = N'db_accessadmin')
DROP SCHEMA [db_accessadmin]
GO
IF EXISTS (SELECT * FROM sys.schemas WHERE name = N'db_backupoperator')
DROP SCHEMA [db_backupoperator]
GO
IF EXISTS (SELECT * FROM sys.schemas WHERE name = N'db_datareader')
DROP SCHEMA [db_datareader]
GO
IF EXISTS (SELECT * FROM sys.schemas WHERE name = N'db_datawriter')
DROP SCHEMA [db_datawriter]
GO
IF EXISTS (SELECT * FROM sys.schemas WHERE name = N'db_ddladmin')
DROP SCHEMA [db_ddladmin]
GO
IF EXISTS (SELECT * FROM sys.schemas WHERE name = N'db_denydatareader')
DROP SCHEMA [db_denydatareader]
GO
IF EXISTS (SELECT * FROM sys.schemas WHERE name = N'db_denydatawriter')
DROP SCHEMA [db_denydatawriter]
GO
IF EXISTS (SELECT * FROM sys.schemas WHERE name = N'db_owner')
DROP SCHEMA [db_owner]
GO
IF EXISTS (SELECT * FROM sys.schemas WHERE name = N'db_securityadmin')
DROP SCHEMA [db_securityadmin]
GO
如果从 model
数据库中删除这些架构,它们将不会显示在新数据库中。 无法删除包含对象的架构。
无法删除以下架构:
dbo
guest
sys
INFORMATION_SCHEMA
注意
sys
和 INFORMATION_SCHEMA
架构是为系统对象而保留的。 您不能在这些架构中创建对象,而且不能删除它们。
dbo 架构
dbo
架构是每个数据库的默认架构。 默认情况下,使用 CREATE USER Transact-SQL 命令创建的用户的默认架构为 dbo
。 dbo
架构由 dbo
用户帐户拥有。
默认架构被分配为 dbo
的用户不会继承 dbo
用户帐户的权限。 用户不从架构继承权限;架构权限由架构中包含的数据库对象继承。 用户的默认架构仅用于对象引用,以防用户在查询对象时省略架构。
注意
当使用部分名称来引用数据库对象时,SQL Server 首先在用户的默认架构中查找。 如果在此处未找到该对象,则 SQL Server 其次将在 dbo
架构中查找。 如果对象不在 dbo
架构中,则会返回一个错误。