1,用户:数据库用户是数据库级别上的主体。每个数据库用户都是 public 角色的成员。
guest 用户
创建数据库时,该数据库默认包含 guest 用户。授予 guest 用户的权限由在数据库中没有用户帐户的用户继承。
不能删除 guest 
,2,应用程序角色:
应用程序角色是一个数据库主体,它使应用程序能够用其自身的、类似用户的权限来运行。使用应用程序角色,可以只允许通过特定应用程序连接的用户访问特定数据。与数据库角色不同的是,应用程序角色默认情况下不包含任何成员,而且是非活动的。应用程序角色使用两种身份验证模式。可以使用 sp_setapprole 启用应用程序角色,该过程需要密码。因为应用程序角色是数据库级主体,所以它们只能通过其他数据库中为 guest 授予的权限来访问这些数据库。因此,其他数据库中的应用程序角色将无法访问任何已禁用 guest 的数据库。在 SQL Server 中,应用程序角色无法访问服务器级元数据,因为它们不与服务器级主体关联。若要禁用此限制,从而允许应用程序角色访问服务器级元数据,请设置全局标志 4616连接应用程序角色
应用程序角色切换安全上下文的过程包括下列步骤:用户执行客户端应用程序。
客户端应用程序作为用户连接到 SQL Server。
然后应用程序用一个只有它才知道的密码执行 sp_setapprole 存储过程。
如果应用程序角色名称和密码都有效,则启用应用程序角色。
此时,连接将失去用户权限,而获得应用程序角色权限。
通过应用程序角色获得的权限在连接期间始终有效。在 SQL Server 的早期版本中,用户若要在启动应用程序角色后重新获取其原始安全上下文,唯一的方法就是断开 SQL Server 连接,然后再重新连接。从 SQL Server 2005 开始,sp_setapprole 有了一个可创建 cookie 的选项。Cookie 包含启用应用程序角色之前的上下文信息。sp_unsetapprole 可以使用此 Cookie 将会话恢复到其原始上下文。有关这个新选项和示例的信息,请参阅 sp_setapprole (Transact-SQL)。安全说明: 
SqlClient 不支持 ODBC encrypt 选项。通过网络传输机密信息时,请使用安全套接字层 (SSL) 或 IPSec 对通道进行加密。如果必须使凭据在客户端应用程序中持久化,请使用加密 API 函数来加密凭据。在 SQL Server 2005 及更高版本中,参数 password 将作为单向哈希进行存储。 3,SID和ID如果要编写与 SQL Server 引擎进行交互的代码,则应该注意用作主体内部表示形式的两个号码。每个主体都具有一个 ID 和一个安全 ID (SID)。这些号码的含义和源取决于主体的创建方式,同时与主体是服务器主体还是数据库主体有关。服务器级标识号
创建 SQL Server 登录名时,便会为它分配一个 ID 和一个 SID。这些号码在 sys.server_principals 目录视图中显示为 principal_id 和 SID。ID (principal_id) 将登录名标识为服务器上的安全对象。创建登录名时由 SQL Server 分配此 ID。删除登录名时,将回收其 ID 号。SID 标识登录名的安全上下文,并且在服务器实例中是唯一的。SID 的源取决于登录名的创建方式。如果通过 Windows 用户或组创建登录名,则会为它指定源主体的 Windows SID;Windows SID 在域中是唯一的。如果通过证书或非对称密钥创建 SQL Server 登录名,则会为它分配源自公钥的 SHA-1 哈希的 SID。如果按照需要密码的、早期样式的 SQL Server 登录名创建登录名,则服务器将生成一个 SID。数据库级标识号
创建数据库用户时,便会为它分配一个 ID 和一个安全 ID (SID)。这些号码在 sys.database_principals 目录视图中显示为 principal_id 和 SID。ID 将用户标识为数据库中的安全对象。删除数据库用户时,将回收其 ID。分配给数据库用户的 SID 在数据库中是唯一的。SID 的源取决于数据库用户的创建方式。如果通过 SQL Server 登录名创建用户,则会为它指定登录名的 SID。如果通过证书或非对称密钥创建用户,则 SID 源自公钥的 SHA-1 哈希。最大数据库用户数
最大数据库用户数由用户 ID 字段的大小确定。用户 ID 的值必须为零或正整数。在 SQL Server 2000 中,将用户 ID 存储为 16 位的 smallint(其中一位是符号)。因此,SQL Server 2000 中最大用户 ID 数是 2的15次方 = 32,768。在 SQL Server 2005 及更高版本中,将用户 ID 存储为 32 位的 int(其中一位是符号)。这些附加的位可以分配 2的31次方 = 2,147,483,648 的 ID 号。数据库用户 ID 划分为预分配的范围省略。
--图片在我空间用户 ID 大小从 smallint(16 位)增加到 int(32 位)。如果传递的是 32 位用户 ID,则要求使用 16 位用户 ID 的 API 将返回错误结果。当迁移为 SQL Server 2000 或早期版本创建的数据和应用程序时,应检查代码是否引用了以下不推荐使用的接口。sysuserssyscacheobjectssysmemberssysobjectssyspermissionssysprocessessysprotectssystypesUSER_ID这些接口需要 16 位用户 ID。当使用 32 位用户 ID 时,这些接口将返回错误结果。
4,如何创建数据库用户:使用 SQL Server Management Studio 创建数据库用户
在 SQL Server Management Studio 中,打开对象资源管理器,然后展开“数据库”文件夹。展开要在其中创建新数据库用户的数据库。右键单击“安全性”文件夹,指向“新建”,再单击“用户”。在“常规”页的“用户名”框中输入新用户的名称。在“登录名”框中,输入要映射到数据库用户的 SQL Server 登录名的名称。单击“确定”。 使用 Transact-SQL 创建数据库用户
在查询编辑器中,通过执行以下 Transact-SQL 命令连接至要在其中创建新数据库用户的数据库:
USE <database name> 
GO
通过执行以下 Transact-SQL 命令创建用户:
CREATE USER <new user name> FOR LOGIN <login name> ;
GO5,如何创建 SQL Server 登录名:创建使用 Windows 身份验证 (SQL Server Management Studio) 的 SQL Server 登录名
在 SQL Server Management Studio 中,打开对象资源管理器并展开要在其中创建新登录名的服务器实例的文件夹。右键单击“安全性”文件夹,指向“新建”,然后单击“登录名”。在“常规”页上的“登录名”框中输入一个 Windows 用户名。选择“Windows 身份验证”。单击“确定”。 创建使用 SQL Server 身份验证 (SQL Server Management Studio) 的 SQL Server 登录名
在 SQL Server Management Studio 中,打开对象资源管理器并展开要在其中创建新登录名的服务器实例的文件夹。右键单击“安全性”文件夹,指向“新建”,然后单击“登录名”。在“常规”页上的“登录名”框中输入一个新登录名的名称。选择“SQL Server 身份验证”。Windows 身份验证是更安全的选择。输入登录名的密码。选择应当应用于新登录名的密码策略选项。通常,强制密码策略是更安全的选择。单击“确定”。 通过 Transact-SQL 创建使用 Windows 身份验证的 SQL Server 登录名
在查询编辑器中,输入以下 Transact-SQL 命令:
CREATE LOGIN <name of Windows User> FROM WINDOWS;
GO 通过 Transact-SQL 创建使用 SQL Server 身份验证的 SQL Server 登录名
在查询编辑器中,输入以下 Transact-SQL 命令:
CREATE LOGIN <login name> WITH PASSWORD = '<password>' ; 
GO6,服务器级角色:
为便于管理服务器上的权限,SQL Server 提供了若干“角色”,这些角色是用于分组其他主体的安全主体。“角色”类似于 Microsoft Windows 操作系统中的“组”。服务器级角色也称为“固定服务器角色”,因为您不能创建新的服务器级角色。服务器级角色的权限作用域为服务器范围。您可以向服务器级角色中添加 SQL Server 登录名、Windows 帐户和 Windows 组。固定服务器角色的每个成员都可以向其所属角色添加其他登录名。下表显示了服务器级角色及其能够执行的操作。服务器级角色名称   说明  
sysadmin          sysadmin 固定服务器角色的成员可以在服务器上执行任何活动。默认情况下,Windows BUILTIN\Administrators 组(本                   地管理员组)的所有成员都是 sysadmin 固定服务器角色的成员。
 
serveradmin       serveradmin 固定服务器角色的成员可以更改服务器范围的配置选项和关闭服务器。
 
securityadmin     securityadmin 固定服务器角色的成员可以管理登录名及其属性。他们可以 GRANT、DENY 和 REVOKE 服务器级别的权限。                  他们还可以 GRANT、DENY 和 REVOKE 数据库级别的权限。此外,他们还可以重置 SQL Server 登录名的密码。
 
processadmin       processadmin 固定服务器角色的成员可以终止在SQL Server 实例中运行的进程。
 
setupadmin        setupadmin 固定服务器角色的成员可以添加和删除链接服务器。
 
bulkadmin         bulkadmin 固定服务器角色的成员可以运行 BULK INSERT 语句。
 
diskadmin         diskadmin 固定服务器角色用于管理磁盘文件。
 
dbcreator         dbcreator 固定服务器角色的成员可以创建、更改、删除和还原任何数据库。
 7,数据库级别的角色:为便于管理数据库中的权限,SQL Server 提供了若干“角色”,这些角色是用于分组其他主体的安全主体。它们类似于 Microsoft Windows 操作系统中的组。数据库级角色的权限作用域为数据库范围。SQL Server 中有两种类型的数据库级角色:数据库中预定义的“固定数据库角色”和您可以创建的“灵活数据库角色”。固定数据库角色是在数据库级别定义的,并且存在于每个数据库中。db_owner 和 db_securityadmin 数据库角色的成员可以管理固定数据库角色成员身份。但是,只有 db_owner 数据库角色的成员能够向 db_owner 固定数据库角色中添加成员。msdb 数据库中还有一些特殊用途的固定数据库角色。您可以向数据库级角色中添加任何数据库帐户和其他 SQL Server 角色。固定数据库角色的每个成员都可向同一个角色添加其他登录名。重要提示: 
请不要将灵活数据库角色添加为固定角色的成员。这会导致意外的权限升级。
 
下表显示了固定数据库级角色及其能够执行的操作。所有数据库中都有这些角色。数据库级别的角色名称  说明  
db_owner             db_owner 固定数据库角色的成员可以执行数据库的所有配置和维护活动,还可以删除数据库。
 
db_securityadmin     db_securityadmin 固定数据库角色的成员可以修改角色成员身份和管理权限。向此角色中添加主体可能会导致意外的                     权限升级。
 
db_accessadmin       db_accessadmin 固定数据库角色的成员可以为 Windows 登录名、Windows 组和 SQL Server 登录名添加或删除数据                     库访问权限。
 
db_backupoperator    db_backupoperator 固定数据库角色的成员可以备份数据库。
 
db_ddladmin          db_ddladmin 固定数据库角色的成员可以在数据库中运行任何数据定义语言 (DDL) 命令。
 
db_datawriter        db_datawriter 固定数据库角色的成员可以在所有用户表中添加、删除或更改数据。
 
db_datareader        db_datareader 固定数据库角色的成员可以从所有用户表中读取所有数据。
 
db_denydatawriter    db_denydatawriter 固定数据库角色的成员不能添加、修改或删除数据库内用户表中的任何数据。
 
db_denydatareader    db_denydatareader 固定数据库角色的成员不能读取数据库内用户表中的任何数据。
 msdb 角色
msdb 数据库中包含下表显示的特殊用途的角色。msdb    角色名称    说明  
db_ssisadmin db_ssisoperator db_ssisltduser 
 这些数据库角色的成员可以管理和使用 SSIS。从早期版本升级的 SQL Server 实例可能包含使用 Data Transformation Services (DTS)(而不是 SSIS)命名的旧版本角色。有关详细信息,请参阅 使用 Integration Services 角色。
 
dc_admin dc_operator dc_proxy 
这些数据库角色的成员可以管理和使用数据收集器。有关详细信息,请参阅数据收集器的安全性。
 
PolicyAdministratorRole 
 db_ PolicyAdministratorRole 数据库角色的成员可以对基于策略的管理策略和条件执行所有配置和维护活动。有关详细信息,请参阅使用基于策略的管理来管理服务器。
 
ServerGroupAdministratorRole ServerGroupReaderRole 
 这些数据库角色的成员可以管理和使用注册的服务器组。有关详细信息,请参阅创建服务器组。
 使用服务器级角色
下表说明了用于服务器级角色的命令、视图和函数。功能         类型              说明  
sp_helpdbfixedrole   元数据  返回固定数据库角色的列表。
 
sp_dbfixedrolepermission    元数据   显示固定数据库角色的权限。
 
sp_helprole   元数据  返回当前数据库中有关角色的信息。
 
sp_helprolemember   元数据   返回有关当前数据库中某个角色的成员的信息。
 
sys.database_role_members   元数据   为每个数据库角色的每个成员返回一行。
 
IS_MEMBER   元数据  指示当前用户是否为指定 Microsoft Windows 组或 Microsoft SQL Server 数据库角色的成员。
 
CREATE ROLE命令  在当前数据库中创建新的数据库角色。
 
ALTER ROLE命令  更改数据库角色的名称。
 
DROP ROLE命令   从数据库中删除角色。
 
sp_addrole命令  在当前数据库中创建新的数据库角色。
 
sp_droprole命令  从当前数据库中删除数据库角色。
 
sp_addrolemember命令  为当前数据库中的数据库角色添加数据库用户、数据库角色、Windows 登录名或 Windows 组。
 
sp_droprolemember命令  从当前数据库的 SQL Server 角色中删除安全帐户。
 public 数据库角色
每个数据库用户都属于 public 数据库角色。如果未向某个用户授予或拒绝对安全对象的特定权限时,
该用户将继承授予该对象的 public 角色的权限。

解决方案 »

  1.   

    权限:
    8,权限层次结构:
    数据库引擎管理着可以通过权限进行保护的实体的分层集合。这些实体称为“安全对象”。在安全对象中,最突出的是服务器和数据库,但可以在更细的级别上设置离散权限。SQL Server 通过验证主体是否已获得适当的权限来控制主体对安全对象执行的操作。下图显示了数据库引擎权限层次结构之间的关系:使用权限
    可以使用常见的 Transact-SQL 查询 GRANT、DENY 和 REVOKE 来操作权限。有关权限的信息,可以从 sys.server_permissions 和 sys.database_permissions 目录视图中看到。也可以使用内置函数来查询权限信息。9,权限目录试图:使用为性能和实用工具而优化的目录视图时便会提供权限信息。下列目录视图返回显式授予权限和拒绝权限的列表。sys.database_permissions 
    sys.server_permissions 10,固定数据库角色的权限
    可以将固定数据库角色映射到 SQL Server 中包含的更详细的权限。下表说明了固定数据库角色到权限的映射。固定数据库角色  
    数据库级权限  
    服务器级权限  
    db_accessadmin 
     已授予:ALTER ANY USER、CREATE SCHEMA
     已授予:VIEW ANY DATABASE
     
    db_accessadmin 
     已使用 GRANT 选项授予:CONNECT
     
     
    db_backupoperator 
     已授予:BACKUP DATABASE、BACKUP LOG、CHECKPOINT
     已授予:VIEW ANY DATABASE
     
    db_datareader 
     已授予:SELECT
     已授予:VIEW ANY DATABASE
     
    db_datawriter 
     已授予:DELETE、INSERT、UPDATE
     已授予:VIEW ANY DATABASE
     
    db_ddladmin 
     已授予:ALTER ANY ASSEMBLY、ALTER ANY ASYMMETRIC KEY、ALTER ANY CERTIFICATE、ALTER ANY CONTRACT、ALTER ANY DATABASE DDL TRIGGER、ALTER ANY DATABASE EVENT、NOTIFICATION、ALTER ANY DATASPACE、ALTER ANY FULLTEXT CATALOG、ALTER ANY MESSAGE TYPE、ALTER ANY REMOTE SERVICE BINDING、ALTER ANY ROUTE、ALTER ANY SCHEMA、ALTER ANY SERVICE、ALTER ANY SYMMETRIC KEY、CHECKPOINT、CREATE AGGREGATE、CREATE DEFAULT、CREATE FUNCTION、CREATE PROCEDURE、CREATE QUEUE、CREATE RULE、CREATE SYNONYM、CREATE TABLE、CREATE TYPE、CREATE VIEW、CREATE XML SCHEMA COLLECTION、REFERENCES
     已授予:VIEW ANY DATABASE
     
    db_denydatareader 
     已拒绝:SELECT
     已授予:VIEW ANY DATABASE
     
    db_denydatawriter 
     已拒绝:DELETE、INSERT、UPDATE
     
     
    db_owner 
     已使用 GRANT 选项授予:CONTROL
     已授予:VIEW ANY DATABASE
     
    db_securityadmin 
     已授予:ALTER ANY APPLICATION ROLE、ALTER ANY ROLE、CREATE SCHEMA、VIEW DEFINITION
     已授予:VIEW ANY DATABASE
     
    dbm_monitor 
     已授予:VIEW 数据库镜像监视器中的最新状态重要提示: 
    在数据库镜像监视器中注册了第一个数据库时,将在 msdb 数据库中创建 dbm_monitor 固定数据库角色。在系统管理员为新的 dbm_monitor 角色分配用户之前,该角色没有任何成员。
    已授予:VIEW ANY DATABASE
    11,固定服务器角色的权限:
    固定服务器角色可以映射到 SQL Server 包含的更具体的权限。下表说明了固定服务器角色与权限的映射。固定服务器角色  服务器级权限  
    bulkadmin 
     已授予:ADMINISTER BULK OPERATIONS
     
    dbcreator 
     已授予:CREATE DATABASE
     
    diskadmin 
     已授予:ALTER RESOURCES
     
    processadmin 
     已授予:ALTER ANY CONNECTION、ALTER SERVER STATE
     
    securityadmin 
     已授予:ALTER ANY LOGIN
     
    serveradmin 
     已授予:ALTER ANY ENDPOINT、ALTER RESOURCES、ALTER SERVER STATE、ALTER SETTINGS、SHUTDOWN、VIEW SERVER STATE
     
    setupadmin 
     已授予:ALTER ANY LINKED SERVER
     
    sysadmin 
     已使用 GRANT 选项授予:CONTROL SERVER
     备注
    public 角色拥有 VIEW ANY DATABASE 权限。
    securityadmin 固定服务器角色的成员可以授予服务器级权限和数据库级权限。12,选择身份验证模式:
    在安装过程中,必须为数据库引擎选择身份验证模式。可供选择的模式有两种:Windows 身份验证模式和混合模式。Windows 身份验证模式会启用 Windows 身份验证并禁用 SQL Server 身份验证。混合模式会同时启用 Windows 身份验证和 SQL Server 身份验证。Windows 身份验证始终可用,并且无法禁用。配置身份验证模式
    如果在安装过程中选择混合模式身份验证,则必须为名为 sa 的内置 SQL Server 系统管理员帐户提供一个强密码并确认该密码。sa 帐户通过使用 SQL Server 身份验证进行连接。如果在安装过程中选择 Windows 身份验证,则安装程序会为 SQL Server 身份验证创建 sa 帐户,但会禁用该帐户。如果稍后更改为混合模式身份验证并要使用 sa 帐户,则必须启用该帐户。您可以将任何 Windows 或 SQL Server 帐户配置为系统管理员。由于 sa 帐户广为人知且经常成为恶意用户的攻击目标,因此除非应用程序需要使用 sa 帐户,否则请勿启用该帐户。切勿为 sa 帐户设置空密码或弱密码。若要从 Windows 身份验证模式更改为混合模式身份验证并使用 SQL Server 身份验证,请参阅如何更改服务器身份验证模式。通过 Windows 身份验证进行连接
    当用户通过 Windows 用户帐户连接时,SQL Server 使用操作系统中的 Windows 主体标记验证帐户名和密码。也就是说,用户身份由 Windows 进行确认。SQL Server 不要求提供密码,也不执行身份验证。Windows 身份验证是默认身份验证模式,并且比 SQL Server 身份验证更为安全。Windows 身份验证使用 Kerberos 安全协议,提供有关强密码复杂性验证的密码策略强制,还提供帐户锁定支持,并且支持密码过期。通过 Windows 身份验证完成的连接有时也称为可信连接,这是因为 SQL Server 信任由 Windows 提供的凭据。安全说明: 
    请尽可能使用 Windows 身份验证。
     
    通过 SQL Server 身份验证进行连接
    当使用 SQL Server 身份验证时,在 SQL Server 中创建的登录名并不基于 Windows 用户帐户。用户名和密码均通过使用 SQL Server 创建并存储在 SQL Server 中。通过 SQL Server 身份验证进行连接的用户每次连接时必须提供其凭据(登录名和密码)。当使用 SQL Server 身份验证时,必须为所有 SQL Server 帐户设置强密码。有关强密码的指南,请参阅数据库引擎配置 - 帐户设置。可供 SQL Server 登录名选择使用的密码策略有三种。用户在下次登录时必须更改密码要求用户在下次连接时更改密码。更改密码的功能由 SQL Server Management Studio 提供。如果使用该选项,则第三方软件开发人员应提供此功能。
    强制密码过期对 SQL Server 登录名强制实施计算机的密码最长使用期限策略。
    强制实施密码策略对 SQL Server 登录名强制实施计算机的 Windows 密码策略。这包括密码长度和密码复杂性。此功能需要通过 NetValidatePasswordPolicy API 实现,该 API 只在 Windows Server 2003 和更高版本中提供。
    确定本地计算机的密码策略 
    在“开始”菜单上,单击“运行”。在“运行”对话框中,键入 secpol.msc,然后单击“确定”。在“本地安全设置”应用程序中,依次展开“安全设置”、“帐户策略”,然后单击“密码策略”。密码策略将如结果窗格中所示。SQL Server 身份验证的缺点
    如果用户是具有 Windows 登录名和密码的 Windows 域用户,则还必须提供另一个用于连接的 (SQL Server) 登录名和密码。记住多个登录名和密码对于许多用户而言都较为困难。每次连接到数据库时都必须提供 SQL Server 凭据也十分烦人。
    SQL Server 身份验证无法使用 Kerberos 安全协议。
    SQL Server 登录名不能使用 Windows 提供的其他密码策略。
    SQL Server 身份验证的优点
    允许 SQL Server 支持那些需要进行 SQL Server 身份验证的旧版应用程序和由第三方提供的应用程序。
    允许 SQL Server 支持具有混合操作系统的环境,在这种环境中并不是所有用户均由 Windows 域进行验证。
    允许用户从未知的或不可信的域进行连接。例如,既定客户使用指定的 SQL Server 登录名进行连接以接收其订单状态的应用程序。
    允许 SQL Server 支持基于 Web 的应用程序,在这些应用程序中用户可创建自己的标识。
    允许软件开发人员通过使用基于已知的预设 SQL Server 登录名的复杂权限层次结构来分发应用程序。注意: 
    使用 SQL Server 身份验证不会限制安装 SQL Server 的计算机上的本地管理员权限。 
    内容来自联机丛书