代码之家  ›  专栏  ›  技术社区  ›  Abdu

SQL Server Management Studio 2008未编写表权限脚本

  •  3
  • Abdu  · 技术社区  · 16 年前

    即使我选择了编写对象级权限脚本的选项,SQL Server Management Studio 2008也不为表权限编写脚本。这是一个bug,还是有其他方法可以做到这一点? 它正在为存储过程创建权限,但不为表创建权限。我是系统管理员。

    如果不起作用,是否有可用的SQL Server工具来编写权限脚本?

    1 回复  |  直到 14 年前
        1
  •  2
  •   erlando    14 年前

    我在一个SQL Server论坛站点上看到了这个方便的脚本,但是如果我能再次找到它,我会很生气:

    CREATE VIEW [dbo].[viw_DBPerms] AS
    SELECT 
        CASE 
                WHEN o.type = 'P' THEN 'Stored Procedure' 
                WHEN o.type = 'TF' THEN 'Table Function' 
                WHEN o.type = 'FN' THEN 'Scalar Function' 
                WHEN o.type = 'U' THEN 'Table'
                WHEN o.type = 'V' THEN 'View' 
                WHEN o.type = 'SQ' THEN 'Service Queue'
                ELSE o.type
        END AS [Type],
        s.name AS [Schema], 
        o.name AS [Object],
        pr.name AS [User], 
        pe.permission_name AS Permission
    FROM sys.database_permissions pe
    LEFT JOIN sys.database_principals pr ON pe.grantee_principal_id = pr.principal_id
    JOIN 
        (   SELECT [object_id] AS [id], [name], type, schema_id, 1 AS [class] FROM sys.objects 
            UNION 
            SELECT [service_id] AS [id], [name] COLLATE SQL_Latin1_General_CP1_CI_AS [name], 'Service', '0', 17 AS [class] FROM sys.services 
            UNION
            SELECT [service_cONtract_id] AS [id], [name], 'Service Contract', '0', 16 AS [class] FROM sys.service_contracts
            UNION
            SELECT [message_type_id] AS [id], [name], 'Message Type', '0', 15 AS [class] FROM sys.service_message_types
        ) o 
        ON pe.major_id = o.id AND pe.class = o.class
    LEFT JOIN sys.schemas s ON o.schema_id = s.schema_id
    

    …然后使用:

    SELECT Object, 
        SUM(CASE Permission WHEN 'SELECT' THEN 1 ELSE 0 END) AS 'SELECT',
        SUM(CASE Permission WHEN 'INSERT' THEN 1 ELSE 0 END) AS 'INSERT',
        SUM(CASE Permission WHEN 'UPDATE' THEN 1 ELSE 0 END) AS 'UPDATE',
        SUM(CASE Permission WHEN 'DELETE' THEN 1 ELSE 0 END) AS 'DELETE',
        SUM(CASE Permission WHEN 'ALTER' THEN 1 ELSE 0 END) AS 'ALTER'
    FROM viw_DBPerms
    WHERE [User] = '<sqluser>'
    GROUP BY Object
    

    这在SQL 2005上有效,我希望它在SQL 2008上可以正常工作。