【问题标题】:Check effective permission for user on database object检查用户对数据库对象的有效权限
【发布时间】:2015-07-15 20:30:52
【问题描述】:

我确信类似这样的问题肯定已经在互联网上的某个地方提出过,但我就是找不到。

我正在尝试检查用户对对象的有效权限。如果我已明确授予权限,我可以轻松查找权限:

SELECT TOP(100) * FROM sys.database_permissions p
INNER JOIN sys.database_principals dp ON ( p.grantee_principal_id = dp.principal_id )
WHERE major_id = object_id( 'sp_OACreate' )

但我正在寻找具有诸如 SysAdmin 等角色的用户的有效权限,这些角色将不存在记录。

我想要达到的最终结果是能够查询用户的有效权限,然后在他们缺少权限时授予权限

【问题讨论】:

  • 这不是应该有@objest_id否则
  • @Rush.2707 在这种情况下,object_id( 'sp_OACreate' ) 应该足够了,除非我遗漏了什么?

标签: tsql permissions


【解决方案1】:

好的,

设法找到详细说明 HAS_PERMS_BY_NAME 的此页面,这似乎成功了

DECLARE @User nvarchar(30) = 'MyUser'
DECLARE @Script nvarchar(max)

IF ( CURRENT_USER != 'dbo' )
BEGIN
    Print 'Please execute as ''dbo'' user'
    RETURN
END 

IF ( HAS_PERMS_BY_NAME( @User, 'LOGIN', 'IMPERSONATE' ) = 0 )
BEGIN
    Print 'Can''t Impersonate ' + @User
END
ELSE
BEGIN
    DECLARE @HasPermission bit

    EXECUTE AS LOGIN = @User
    SELECT @HasPermission = HAS_PERMS_BY_NAME( 'sp_OACreate', 'OBJECT', 'EXECUTE' )
    REVERT

    IF ( @HasPermission = 'false' )
    BEGIN
        SET @Script = 'USE master; GRANT EXECUTE ON [sys].[sp_OACreate] TO [' + @User + ']'
        EXECUTE sp_executesql @Script
    END
END

希望这对其他人有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 2019-12-25
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多