Problem getting security for configuration database

  •  Below is what I have put into an execute sql task container.  When I try to run it I have output open and have posted the output.  The code runs fine when I have the configuration database set up to only check one server.  However, when I add anymore to it, the package will get the security from the first db and then error out.  Below is the error output and script.  Any help with my problem is greatly appreciated.

     

    **********Begin script*******************

     

    declare @dbname varchar(200)

    declare @mSql1 varchar(8000)

    DECLARE DBName_Cursor CURSOR FOR

     select name

     from master.dbo.sysdatabases

     where name not in ('mssecurity','tempdb')

     Order by name

    OPEN DBName_Cursor

    FETCH NEXT FROM DBName_Cursor INTO @dbname

    WHILE @@FETCH_STATUS = 0

     BEGIN

      Set @mSQL1 = ' Insert into [tempdb].[dbo].[DBROLES] ( DBName, UserName, db_owner, db_accessadmin,

                      db_securityadmin, db_ddladmin, db_datareader, db_datawriter,

                    db_denydatareader, db_denydatawriter )

     SELECT '+''''+@dbName +''''+ ' as DBName ,UserName, '+char(13)+ ' 

        Max(CASE RoleName WHEN ''db_owner''    THEN ''Yes'' ELSE ''No'' END) AS db_owner,

      Max(CASE RoleName WHEN ''db_accessadmin ''   THEN ''Yes'' ELSE ''No'' END) AS db_accessadmin ,

      Max(CASE RoleName WHEN ''db_securityadmin''  THEN ''Yes'' ELSE ''No'' END) AS db_securityadmin,

      Max(CASE RoleName WHEN ''db_ddladmin''    THEN ''Yes'' ELSE ''No'' END) AS db_ddladmin,

      Max(CASE RoleName WHEN ''db_datareader''    THEN ''Yes'' ELSE ''No'' END) AS db_datareader,

      Max(CASE RoleName WHEN ''db_datawriter''    THEN ''Yes'' ELSE ''No'' END) AS db_datawriter,

        Max(CASE RoleName WHEN ''db_denydatareader'' THEN ''Yes'' ELSE ''No'' END) AS db_denydatareader,

      Max(CASE RoleName WHEN ''db_denydatawriter'' THEN ''Yes'' ELSE ''No'' END) AS db_denydatawriter

     from (

           select b.name as USERName, c.name as RoleName

           from ' + @dbName+'.dbo.sysmembers a '+char(13)+

       ' join '+ @dbName+'.dbo.sysusers  b '+char(13)+

            ' on a.memberuid = b.uid  join '+@dbName +'.dbo.sysusers c

              on a.groupuid = c.uid )s  

         Group by USERName

             order by UserName'

      --Print @mSql1

      Execute (@mSql1)

      FETCH NEXT FROM DBName_Cursor INTO @dbname

     END

    CLOSE DBName_Cursor

    DEALLOCATE DBName_Cursor

    Go

     

     

    ****************End Script***********************

     

     

    ****************Begin Error Output********************

     

    [Execute SQL Task] Error: Executing the query "declare @dbname varchar(200) declare @mSql1 varchar(8000)  DECLARE DBName_Cursor CURSOR FOR   select name   from master.dbo.sysdatabases   where name not in ('mssecurity','tempdb')  Order by name  OPEN DBName_Cursor  FETCH NEXT FROM DBName_Cursor INTO @dbname  WHILE @@FETCH_STATUS = 0  BEGIN   Set @mSQL1 = ' Insert into [tempdb].[dbo].[DBROLES] ( DBName, UserName, db_owner, db_accessadmin,                    db_securityadmin, db_ddladmin, db_datareader, db_datawriter,                 db_denydatareader, db_denydatawriter )  SELECT '+''''+@dbName +''''+ ' as DBName ,UserName, '+char(13)+ '      Max(CASE RoleName WHEN ''db_owner''    THEN ''Yes'' ELSE ''No'' END) AS db_owner,   Max(CASE RoleName WHEN ''db_accessadmin ''   THEN ''Yes'' ELSE ''No'' END) AS db_accessadmin ,   Max(CASE RoleName WHEN ''db_securityadmin''  THEN ''Yes'' ELSE ''No'' END) AS db_securityadmin,   Max(CASE RoleName WHEN ''db_ddladmin''    THEN ''Yes'' ELSE ''No'' END) AS db_ddladmin,   Max(CASE RoleName WHEN ''db_datareader''    THEN ''Yes'' ELSE ''No'' END) AS db_datareader,   Max(CASE RoleName WHEN ''db_datawriter''    THEN ''Yes'' ELSE ''No'' END) AS db_datawriter,     Max(CASE RoleName WHEN ''db_denydatareader'' THEN ''Yes'' ELSE ''No'' END) AS db_denydatareader,   Max(CASE RoleName WHEN ''db_denydatawriter'' THEN ''Yes'' ELSE ''No'' END) AS db_denydatawriter  from (        select b.name as USERName, c.name as RoleName         from ' + @dbName+'.dbo.sysmembers a '+char(13)+     ' join '+ @dbName+'.dbo.sysusers  b '+char(13)+         ' on a.memberuid = b.uid  join '+@dbName +'.dbo.sysusers c           on a.groupuid = c.uid )s        Group by USERName           order by UserName'    --Print @mSql1   Execute (@mSql1)    FETCH NEXT FROM DBName_Cursor INTO @dbname  END  CLOSE DBName_Cursor DEALLOCATE DBName_Cursor " failed with the following error: "Line 15: Incorrect syntax near '-'.". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.

     

    **************End Error Output**************

  • Why can't you use the inbuilt SP sp_MSforeachDb to loop through databases instead of using a cursor. Try that.

    Cheers,
    Sugeshkumar Rajendran
    SQL Server MVP
    http://sugeshkr.blogspot.com

Viewing 2 posts - 1 through 1 (of 1 total)

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