has_perms_by_name为用户没有权限的系统存储过程返回1

时间:2014-01-11 22:26:07

标签: sql-server

在SQL Server 2012中,怎么可能

select has_perms_by_name('sp_grantlogin', 'object', 'execute')

...返回1,但从同一Windows用户调用sp_grantlogin返回

Msg 15247, Level 16, State 1, Procedure sp_grantlogin, Line 13
User does not have permission to perform this action

2 个答案:

答案 0 :(得分:4)

这是正确的。

用户有权执行存储过程,但存储过程中的代码在执行时会抛出该错误。

您可以使用

检查存储过程代码
EXEC sp_helptext 'sp_grantlogin'

显示

-- CHECK PERMISSIONS --
IF ( NOT is_srvrolemember('securityadmin') = 1 )
  BEGIN
      DBCC auditevent (105, 1, 0, @loginame, NULL, NULL, NULL, NULL, NULL, NULL)

      RAISERROR(15247,-1,-1)

      RETURN ( 1 )
  END 

要查看错误15247,您可以使用

SELECT *
FROM sys.messages
WHERE message_id = 15247 and language_id = 1033

返回

  

用户无权执行此操作。

答案 1 :(得分:0)

确保在SQL Server Management Studio中启用了sysadminsecurityadmin服务器角色。

为此,请在SQL Server Management Studio中执行以下操作:

  • 连接到用户所属的数据库
  • 展开数据库的节点
  • 展开标记为Security
  • 的节点
  • 展开标记为Login
  • 的节点
  • 右键单击列表中的用户名
  • 点击服务器角色
  • 点击复选框
  • 启用securityadmin
  • 点击复选框
  • 启用sysadmin