Transfer of Logins for a single Database

Hi Mates,

Today I am going to share script which can be handful while performing Migrations. As all of us know SQL Server 2008 is soon going to become out of support.

Many of us will be busy in doing migrations hence I thought of sharing revised version of sp_help_revlogin which can transfer the logins only for the intended database.

I am really sorry for not able to give credit to the original Script writer as I am not sure who has developed it.

USE master

GO

IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL

 DROP PROCEDURE sp_hexadecimal

GO

CREATE PROCEDURE sp_hexadecimal

   @binvalue varbinary(256),

   @hexvalue varchar (514) OUTPUT

AS

DECLARE @charvalue varchar (514)

DECLARE @i int

DECLARE @length int

DECLARE @hexstring char(16)

SELECT @charvalue = '0x'

SELECT @i = 1

SELECT @length = DATALENGTH (@binvalue)

SELECT @hexstring = '0123456789ABCDEF'

WHILE (@i <= @length)

BEGIN

 DECLARE @tempint int

 DECLARE @firstint int

 DECLARE @secondint int

 SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))

 SELECT @firstint = FLOOR(@tempint/16)

 SELECT @secondint = @tempint - (@firstint*16)

 SELECT @charvalue = @charvalue +

   SUBSTRING(@hexstring, @firstint+1, 1) +

   SUBSTRING(@hexstring, @secondint+1, 1)

 SELECT @i = @i + 1

END

SELECT @hexvalue = @charvalue

GO

IF OBJECT_ID ('sp_help_revlogin2') IS NOT NULL

 DROP PROCEDURE sp_help_revlogin2

GO

CREATE PROCEDURE sp_help_revlogin2 @login_name sysname = NULL, @db_name sysname = NULL

AS

DECLARE @name sysname

DECLARE @type varchar (1)

DECLARE @hasaccess int

DECLARE @denylogin int

DECLARE @is_disabled int

DECLARE @PWD_varbinary  varbinary (256)

DECLARE @PWD_string  varchar (514)

DECLARE @SID_varbinary varbinary (85)

DECLARE @SID_string varchar (514)

DECLARE @tmpstr  varchar (1024)

DECLARE @is_policy_checked varchar (3)

DECLARE @is_expiration_checked varchar (3)

-- The code below this has been changed from original sp_help_revlogin stored proc

declare @sql varchar(500)

IF (@login_name IS NULL and @db_name is NULL)

 DECLARE login_curs CURSOR FOR

     SELECT p.sid, p.name, p.type, p.is_disabled, l.hasaccess, l.denylogin

       FROM sys.server_principals p LEFT JOIN sys.syslogins l ON ( l.name = p.name )

       WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name <> 'sa'

ELSE

IF (@login_name IS NOT NULL)

 DECLARE login_curs CURSOR FOR

     SELECT p.sid, p.name, p.type, p.is_disabled, l.hasaccess, l.denylogin

       FROM sys.server_principals p LEFT JOIN sys.syslogins l ON ( l.name = p.name )

       WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name = @login_name

ELSE

IF (@db_name is not null)

       begin

       select @sql='DECLARE login_curs CURSOR FOR SELECT p.sid, p.name, p.type, p.is_disabled, l.hasaccess, l.denylogin

       FROM sys.server_principals p LEFT JOIN sys.syslogins l

       ON ( l.name = p.name )

       join '+@db_name+'.sys.database_principals d

       on d.sid=p.sid

       WHERE p.type IN ( ''S'', ''G'', ''U'' ) AND p.name <> ''sa''

       order by p.name'

       exec (@sql)

       end

-- The code above this line has been changed from original sp_help_revlogin stored proc

OPEN login_curs

FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @hasaccess, @denylogin

IF (@@fetch_status = -1)

BEGIN

 PRINT 'No login(s) found.'

 CLOSE login_curs

 DEALLOCATE login_curs

 RETURN -1

END

SET @tmpstr = '/* sp_help_revlogin script '

PRINT @tmpstr

SET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'

PRINT @tmpstr

PRINT ''

WHILE (@@fetch_status <> -1)

BEGIN

 IF (@@fetch_status <> -2)

 BEGIN

   PRINT ''

   SET @tmpstr = '-- Login: ' + @name

   PRINT @tmpstr

   IF (@type IN ( 'G', 'U'))

   BEGIN -- NT authenticated account/group

     SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS'

   END

   ELSE BEGIN -- SQL Server authentication

       -- obtain password and sid

       SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) )

       EXEC sp_hexadecimal @PWD_varbinary, @PWD_string OUT

       EXEC sp_hexadecimal @SID_varbinary, @SID_string OUT

       -- obtain password policy state

       SELECT @is_policy_checked =

           CASE is_policy_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END

           FROM sys.sql_logins WHERE name = @name

       SELECT @is_expiration_checked =

           CASE is_expiration_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END

           FROM sys.sql_logins WHERE name = @name

       SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name )

           + ' WITH PASSWORD = ' + @PWD_string

           + ' HASHED, SID = ' + @SID_string

       IF ( @is_policy_checked IS NOT NULL )

       BEGIN

         SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked

       END

       IF ( @is_expiration_checked IS NOT NULL )

       BEGIN

         SET @tmpstr = @tmpstr + ', CHECK_EXPIRATION = ' + @is_expiration_checked

       END

   END

   IF (@denylogin = 1)

   BEGIN -- login is denied access

     SET @tmpstr = @tmpstr + '; DENY CONNECT SQL TO ' + QUOTENAME( @name )

   END

   ELSE IF (@hasaccess = 0)

   BEGIN -- login has exists but does not have access

     SET @tmpstr = @tmpstr + '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name )

   END

   IF (@is_disabled = 1)

   BEGIN -- login is disabled

     SET @tmpstr = @tmpstr + '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE'

   END

   PRINT @tmpstr

 END

 FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @hasaccess, @denylogin

 END

CLOSE login_curs

DEALLOCATE login_curs

RETURN 0

GO


Usage:  exec sp_help_revlogin2 null,'Test'

Here in the above Stored procedure there are 2 parameters login name & Database name.

In my case i was scripting out the logins only for test database


Note: As I said above I got this script from some source hence Kindly double check before making use of it.

Comments