How to get all user roles on 2005?

  • :w00t:

    :exclamation:

    Hello. This might something I am not familiar with in 2005. I have to restore a database in a test environment using a production backup. No big deal there. But the users in test are almost 100% different than production.

    In 2000, I just scripted the users including the roles they belong and after restore I just moved them back with the proper roles.

    In 2005, I cannot figure out how can I script them out. If I script the users in the database I get CREATE USER statements, but no roles or grants come back. Any suggestion? I think I am missing something I am not familiar with in 2005 in order to get them. Thank you for your help.

  • Did u tried to generate scripts with the wizard making the options for object level permission to true?

  • Yes. If I script the objects I get the permissions for each object. The issue I am experiencing is when I script the users to get like

    sp_addrolemember scripting

  • There is no straight way thru SSMS. I think you gotta have a custom script. I will do a research and reply you back if i get it.

  • Here's a script you could try. I don't remember where I got it or I would credit the original author.

    DECLARE @DatabaseUserName [sysname]

    SET @DatabaseUserName = 'user_name_goes_here'

    SET NOCOUNT ON

    DECLARE

    @errStatement [varchar](8000),

    @msgStatement [varchar](8000),

    @DatabaseUserID [smallint],

    @ServerUserName [sysname],

    @RoleName [varchar](8000),

    @ObjectID [int],

    @ObjectName [varchar](261)

    SELECT

    @DatabaseUserID = [sysusers].[uid],

    @ServerUserName = [master].[dbo].[syslogins].[loginname]

    FROM [dbo].[sysusers]

    INNER JOIN [master].[dbo].[syslogins]

    ON [sysusers].[sid] = [master].[dbo].[syslogins].[sid]

    WHERE [sysusers].[name] = @DatabaseUserName

    IF @DatabaseUserID IS NULL

    BEGIN

    SET @errStatement = 'User ' + @DatabaseUserName + ' does not exist in ' + DB_NAME() + CHAR(13) +

    'Please provide the name of a current user in ' + DB_NAME() + ' you wish to script.'

    RAISERROR(@errStatement, 16, 1)

    END

    ELSE

    BEGIN

    SET @msgStatement = '--Security creation script for user ' + @ServerUserName + CHAR(13) +

    '--Created At: ' + CONVERT(varchar, GETDATE(), 112) + REPLACE(CONVERT(varchar, GETDATE(), 108), ':', '') + CHAR(13) +

    '--Created By: ' + SUSER_NAME() + CHAR(13) +

    '--Add User To Database' + CHAR(13) +

    'USE [' + DB_NAME() + ']' + CHAR(13) +

    'EXEC [sp_grantdbaccess]' + CHAR(13) +

    CHAR(9) + '@loginame = ''' + @ServerUserName + ''',' + CHAR(13) +

    CHAR(9) + '@name_in_db = ''' + @DatabaseUserName + '''' + CHAR(13) +

    'GO' + CHAR(13) +

    '--Add User To Roles'

    PRINT @msgStatement

    DECLARE _sysusers

    CURSOR

    LOCAL

    FORWARD_ONLY

    READ_ONLY

    FOR

    SELECT

    [name]

    FROM [dbo].[sysusers]

    WHERE

    [uid] IN

    (

    SELECT

    [groupuid]

    FROM [dbo].[sysmembers]

    WHERE [memberuid] = @DatabaseUserID

    )

    OPEN _sysusers

    FETCH

    NEXT

    FROM _sysusers

    INTO @RoleName

    WHILE @@FETCH_STATUS = 0

    BEGIN

    SET @msgStatement = 'EXEC [sp_addrolemember]' + CHAR(13) +

    CHAR(9) + '@rolename = ''' + @RoleName + ''',' + CHAR(13) +

    CHAR(9) + '@membername = ''' + @DatabaseUserName + ''''

    PRINT @msgStatement

    FETCH

    NEXT

    FROM _sysusers

    INTO @RoleName

    END

    SET @msgStatement = 'GO' + CHAR(13) +

    '--Set Object Specific Permissions'

    PRINT @msgStatement

    DECLARE _sysobjects

    CURSOR

    LOCAL

    FORWARD_ONLY

    READ_ONLY

    FOR

    SELECT

    DISTINCT([sysobjects].[id]),

    '[' + USER_NAME([sysobjects].[uid]) + '].[' + [sysobjects].[name] + ']'

    FROM [dbo].[sysprotects]

    INNER JOIN [dbo].[sysobjects]

    ON [sysprotects].[id] = [sysobjects].[id]

    WHERE [sysprotects].[uid] = @DatabaseUserID

    OPEN _sysobjects

    FETCH

    NEXT

    FROM _sysobjects

    INTO

    @ObjectID,

    @ObjectName

    WHILE @@FETCH_STATUS = 0

    BEGIN

    SET @msgStatement = ''

    IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 193 AND [protecttype] = 205)

    SET @msgStatement = @msgStatement + 'SELECT,'

    IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 195 AND [protecttype] = 205)

    SET @msgStatement = @msgStatement + 'INSERT,'

    IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 197 AND [protecttype] = 205)

    SET @msgStatement = @msgStatement + 'UPDATE,'

    IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 196 AND [protecttype] = 205)

    SET @msgStatement = @msgStatement + 'DELETE,'

    IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 224 AND [protecttype] = 205)

    SET @msgStatement = @msgStatement + 'EXECUTE,'

    IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 26 AND [protecttype] = 205)

    SET @msgStatement = @msgStatement + 'REFERENCES,'

    IF LEN(@msgStatement) > 0

    BEGIN

    IF RIGHT(@msgStatement, 1) = ','

    SET @msgStatement = LEFT(@msgStatement, LEN(@msgStatement) - 1)

    SET @msgStatement = 'GRANT' + CHAR(13) +

    CHAR(9) + @msgStatement + CHAR(13) +

    CHAR(9) + 'ON ' + @ObjectName + CHAR(13) +

    CHAR(9) + 'TO ' + @DatabaseUserName

    PRINT @msgStatement

    END

    SET @msgStatement = ''

    IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 193 AND [protecttype] = 206)

    SET @msgStatement = @msgStatement + 'SELECT,'

    IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 195 AND [protecttype] = 206)

    SET @msgStatement = @msgStatement + 'INSERT,'

    IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 197 AND [protecttype] = 206)

    SET @msgStatement = @msgStatement + 'UPDATE,'

    IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 196 AND [protecttype] = 206)

    SET @msgStatement = @msgStatement + 'DELETE,'

    IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 224 AND [protecttype] = 206)

    SET @msgStatement = @msgStatement + 'EXECUTE,'

    IF EXISTS(SELECT * FROM [dbo].[sysprotects] WHERE [id] = @ObjectID AND [uid] = @DatabaseUserID AND [action] = 26 AND [protecttype] = 206)

    SET @msgStatement = @msgStatement + 'REFERENCES,'

    IF LEN(@msgStatement) > 0

    BEGIN

    IF RIGHT(@msgStatement, 1) = ','

    SET @msgStatement = LEFT(@msgStatement, LEN(@msgStatement) - 1)

    SET @msgStatement = 'DENY' + CHAR(13) +

    CHAR(9) + @msgStatement + CHAR(13) +

    CHAR(9) + 'ON ' + @ObjectName + CHAR(13) +

    CHAR(9) + 'TO ' + @DatabaseUserName

    PRINT @msgStatement

    END

    FETCH

    NEXT

    FROM _sysobjects

    INTO

    @ObjectID,

    @ObjectName

    END

    CLOSE _sysobjects

    DEALLOCATE _sysobjects

    PRINT 'GO'

    END

    Greg

  • Fernando (10/8/2008)


    :w00t:

    :exclamation:

    Hello. This might something I am not familiar with in 2005. I have to restore a database in a test environment using a production backup. No big deal there. But the users in test are almost 100% different than production.

    In 2000, I just scripted the users including the roles they belong and after restore I just moved them back with the proper roles.

    In 2005, I cannot figure out how can I script them out. If I script the users in the database I get CREATE USER statements, but no roles or grants come back. Any suggestion? I think I am missing something I am not familiar with in 2005 in order to get them. Thank you for your help.

    Scripting the Roles was lost in 2005 until SP2 when it was added back in. Note that the "Scripters" are part of the client code, and not part of the server. So you need to apply SP2 to whatever clients you are running SSMS on.

    [font="Times New Roman"]-- RBarryYoung[/font], [font="Times New Roman"] (302)375-0451[/font] blog: MovingSQL.com, Twitter: @RBarryYoung[font="Arial Black"]
    Proactive Performance Solutions, Inc.
    [/font]
    [font="Verdana"] "Performance is our middle name."[/font]

  • Greg,

    If a user is assigned an application role, Can we script that too?

    Thanks

  • Thank you for your input. Here is what I have so far.

    No longer available until SP2 -- I do have SP 2 I am assuming I have to set the value in the options? I will try that

    The script -- It worked fine, I will check how to set this for all the users at once and not one by one What if I have 200 or more users??? A good task and time consuming issue. My only concern is that it does reset the user to the database and roles, but what if the database is a migrated copy of the production one, like in my case I restored from production to stage

    As always you all, have being of great help. I will continue my quest to get something easy to use. I even engaged Microsoft, but have not received an answer yet. Will keep you posted on that. Thank you again

  • srawant,

    You should be able to script out an application role by querying sys.database_principals, though I haven't had the need to do it.

    Greg

  • Greg,

    I queried the sys.database_principals but it did not retrieve the application roles. It only displayed the database roles and some other schemas..

  • I'll suggest that what you're looking for isn't an application role or you're querying in the wrong database. Can you see the application role in SSMS when you expand Security, Roles, Application Roles?

    Greg

  • I'll suggest that what you're looking for isn't an application role or you're querying in the wrong database. Can you see the application role in SSMS when you expand Security, Roles, Application Roles?

    Actually, application roles don't have members so you wouldn't be able to get them when you queried for a user anyway.

    Greg

  • Yes Greg I m sorry I was in the wrong database. Thanks anyways.

Viewing 13 posts - 1 through 12 (of 12 total)

You must be logged in to reply to this topic. Login to reply