SQL SERVER 數據庫,用戶權限遷移實錄


參考:https://blog.csdn.net/weixin_34205826/article/details/89907788

 

把SQL SERVER里面的用戶權限做遷移,從A遷移到B,當時就挑起興趣了,之前都是做過數據庫的遷移,就是數據庫分離,然后附加!安全一點的就是備份,恢復!

用戶安全性的遷移貌似沒做過,在網上Google了一下,在這里記錄了一些信息,列舉如下:
環境介紹”
Server Name: SCSQL,Contoso.com   IP:192.168.100.125
 
2.  Server Name: SQL2. Contoso.com   IP:192.168.100.125
遷移數據庫對象:      database: SMS_GDA
 
步驟如下:
1. 在SCSQL.CONTOSO.COM下備份數據庫SMS_GDA(完整備份)到 D:\bak\SMS_GDA.BAK,
2. 把SMS_GDA.BAK,復制到SQL2.CONTOSO.COM上,恢復數據庫SMS_GDA.BAK
3. 在SCSQL.contoso.com上執行以下語句:
 
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( intSUBSTRING(@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

4. 在SCSQL.CONTOSO.COM下,查看master數據庫的存儲過程,會多了2個 sp.help.revlogin, sp_hexadecimal

5. 再次執行代碼:
EXEC sp_help_revlogin 
6. 復制執行代碼后的結果
 


7.在 SQL2.CONTOSO.COM 查詢分析器上執行,粘貼過來的代碼
其實大家從圖中已經可以看出來,在SCSQL.CONTOSO.COM的用戶都過來了,語句中出錯的是已經存在的用戶,大家可以在事后去檢查一下,並去驗證登錄請求

驗證:
 
 
 
 
 
 
 
 
 
原文鏈接:https://blog.csdn.net/weixin_34205826/article/details/89907788,
如需轉載請自行聯系原作者
 
 
 
 
 
 
 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

00


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM