sp_setapprole (Transact-SQL)
激活与当前数据库中的应用程序角色关联的权限。
语法
sp_setapprole [ @rolename = ] 'role',
[ @password = ] { encrypt N'password' }
|
'password' [ , [ @encrypt = ] { 'none' | 'odbc' } ]
[ , [ @fCreateCookie = ] true | false ]
[ , [ @cookie = ] @cookie OUTPUT ]
参数
[ @rolename = ] 'role'
当前数据库中定义的应用程序角色的名称。role 的数据类型为 sysname,无默认值。role 必须存在于当前数据库中。[ @password = ] { encrypt N'password' }
激活应用程序角色所需的密码。password 的数据类型为 sysname,无默认值。password 可以使用 ODBC 加密函数进行模糊处理。使用加密函数时,必须通过在第一个引号前面放置 N,将密码转换为 Unicode 字符串。使用 SqlClient 的连接不支持加密选项。
重要提示 ODBC 加密函数不提供加密功能。您不应当依赖该函数来保护通过网络传输的密码。如果通过网络传输该信息,则使用 SSL 或者 IPSec。
@encrypt = 'none'
指定不使用任何模糊代码。密码以明文形式传递到 SQL Server。这是默认设置。@encrypt= 'odbc'
指定在将密码发送到 SQL Server 数据库引擎之前,ODBC 使用 ODBC 加密函数对密码进行模糊处理。这只能在使用 ODBC 客户端或 OLE DB Provider for SQL Server 时指定。[ @fCreateCookie = ] true | false
指定是否创建 cookies。true 将隐式转换为 1。false 隐式转换为 0。[ @cookie = ] @cookie OUTPUT
指定包含 cookie 的输出参数。只有当 @fCreateCookie 的值为 true 时,才生成 cookie。varbinary(8000)
返回代码值
0(成功)或 1(失败)
注释
使用 sp_setapprole 激活应用程序角色之后,该角色将一直保持活动状态,直到用户与服务器断开连接或执行 sp_unsetapprole 为止。sp_setapprole 只能由直接的 Transact-SQL 语句执行。sp_setapprole 不能在其他存储过程或用户定义事务中执行。
有关应用程序角色的概述,请参阅应用程序角色。
安全说明 |
---|
为了在通过网络传输应用程序角色密码时对其进行保护,在启用应用程序角色时应始终使用加密连接。 SqlClient 不支持 Microsoft ODBC 加密选项。如果必须存储凭据,请使用加密 API 函数对这些凭据进行加密。参数 password 作为单向哈希进行存储。为了保持与 SQL Server 早期版本的兼容性,不能由 sp_addapprole 强制实施密码复杂性策略。若要强制实施密码复杂性策略,请使用CREATE APPLICATION ROLE。 |
权限
要求具有 public 成员身份,并了解该角色的密码。
示例
A. 激活应用程序角色但不使用加密选项
以下示例使用明文密码 AsDeF00MbXX 激活名为 SalesAppRole 的应用程序角色,该密码是使用特别为当前用户使用的应用程序设计的权限创建的。
EXEC sp_setapprole 'SalesApprole', 'AsDeF00MbXX';
GO
B. 使用 cookie 激活应用程序角色并恢复到原始上下文中
以下示例使用密码 fdsd896#gfdbfdkjgh700mM 激活 Sales11 应用程序角色并创建一个 cookie。该示例返回当前用户的名称,然后通过执行 sp_unsetapprole 恢复到原始上下文中。
DECLARE @cookie varbinary(8000);
EXEC sp_setapprole 'Sales11', 'fdsd896#gfdbfdkjgh700mM'
, @fCreateCookie = true, @cookie = @cookie OUTPUT;
-- The application role is now active.
SELECT USER_NAME();
-- This will return the name of the application role, Sales11.
EXEC sp_unsetapprole @cookie;
-- The application role is no longer active.
-- The original context has now been restored.
GO
SELECT USER_NAME();
-- This will return the name of the original user.
GO