[MS-SQL] DB 계정 정보 가져오기

DB 이전 작업을 진행하다 보면, DB의 계정 정보도 같이 옮겨 줘야하는 번거로움이 있다. 만약, 계정이 많지 않다면 DB를 옮겨 주고, 이전한 서버에서 하나하나 계정을 만들어 주면 된다. 하지만, 계정이 여러개이고, 각 계정의 비밀번호를 모른다면.... 대략 난감할 것 이다. 이런 경우에는 아래와 같은 방법으로 문제를 해결 할 수 있다.
1. 기존 DB 서버에 SQL Management Studio를 이용해 접속을 한다.
기존 DB서버에 접속후 SQL Management Studio를 실행한다. 그리고 쿼리 편집장을 열도록 한다.
2. 아래 쿼리를 복사해서 실행을 한다.
- 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_revlogin') IS NOT NULL
- DROP PROCEDURE sp_help_revlogin
- GO
- CREATE PROCEDURE sp_help_revlogin @login_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)
- DECLARE @defaultdb sysname
- IF (@login_name IS NULL)
- DECLARE login_curs CURSOR FOR
- SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, 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
- DECLARE login_curs CURSOR FOR
- SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, 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
- OPEN login_curs
- FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @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 WITH DEFAULT_DATABASE = [' + @defaultdb + ']'
- 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 + ', DEFAULT_DATABASE = [' + @defaultdb + ']'
- 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 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, @defaultdb, @hasaccess, @denylogin
- END
- CLOSE login_curs
- DEALLOCATE login_curs
- RETURN 0
- GO
3. 만들어진 프로시져 "sp_help_revlogin"을 실행한다.
- EXEC sp_help_revlogin