【问题标题】:TSQL to know database role membersTSQL 了解数据库角色成员
【发布时间】:2011-01-10 03:10:10
【问题描述】:

我正在使用 SQL 2000 和 SQL 2005。

我想知道哪些登录对哪些数据库具有 db_owner 或 db_accessadmin 权限。

我可以单击每个数据库中的用户或数据库角色来查看。 这可以使用 TSQL 以更简单的方式完成吗?

提前致谢

【问题讨论】:

    标签: sql-server sql-server-2005 tsql sql-server-2000


    【解决方案1】:

    这很草率,可能有更好的方法,但如果这是一次性的事情,这应该可以完成:

    DECLARE
        @db_name SYSNAME,
        @sql VARCHAR(1000)
    
    DECLARE db_cursor CURSOR FOR SELECT Name FROM sys.databases
    OPEN db_cursor
    
    FETCH NEXT FROM db_cursor INTO @db_name
    
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
        SET @sql =
            'SELECT
                ''' + @db_name + ''' AS [Database],
                USER_NAME(role_principal_id) AS [Role],
                USER_NAME(member_principal_id) AS [User]
            FROM
                ' + @db_name + '.sys.database_role_members
            WHERE
                USER_NAME(role_principal_id) IN (''db_owner'', ''db_accessadmin'')'
        EXEC(@sql)
    
        FETCH NEXT FROM db_cursor INTO @db_name
    END
    
    CLOSE db_cursor
    DEALLOCATE db_cursor
    

    SQL 2000 版本应该是:

    DECLARE
        @db_name SYSNAME,
        @sql VARCHAR(1000)
    
    DECLARE db_cursor CURSOR FOR SELECT Name FROM master..sysdatabases
    OPEN db_cursor
    
    FETCH NEXT FROM db_cursor INTO @db_name
    
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
        SET @sql =
            'SELECT
                ''' + @db_name + ''' AS [Database],
                USER_NAME(memberuid) AS [Role],
                USER_NAME(groupuid) AS [User]
            FROM
                sysmembers
            WHERE
                USER_NAME(groupuid) IN (''db_owner'', ''db_accessadmin'')'
        EXEC(@sql)
    
        FETCH NEXT FROM db_cursor INTO @db_name
    END
    
    CLOSE db_cursor
    DEALLOCATE db_cursor
    

    【讨论】:

    • 谢谢。如何在 sql 2000 中运行它?
    【解决方案2】:

    对于 SQL 2000 并且仍然适用于 SQL 2005

    SELECT
        USER_NAME(memberuid), USER_NAME(groupuid)
    FROM
        sys.sysmembers
    WHERE
        USER_NAME(groupuid) IN ('db_owner', 'db_accessadmin')
    

    【讨论】:

    • 非常感谢。并在我所做的所有数据库中运行它: EXEC SP_MSFOREACHDB 'USE [?] ; SELECT DB_NAME(),USER_NAME(memberuid), USER_NAME(groupuid) FROM sysmembers WHERE USER_NAME(groupuid) IN (''db_owner'', ''db_accessadmin'') and user_name(memberuid) not like ''%dbo%'''
    • 抱歉,我是在本地 SQL Server 中完成的,但忘记发布了!
    猜你喜欢
    • 2017-02-20
    • 2012-04-24
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多