SQL SERVER2005 数据库,用户权限迁移实录

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:
今天早上昏昏欲睡,看来昨天电影看多了,有一个Q群网友GEELY问到,说如果把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的用户都过来了,语句中出错的是已经存在的用户,大家可以在事后去检查一下,并去验证登录请求

验证:









本文转自 hz022 51CTO博客,原文链接:http://blog.51cto.com/hz022/405210,如需转载请自行联系原作者
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
3天前
|
SQL Oracle 关系型数据库
sql语句创建数据库
在创建数据库之前,请确保你有足够的权限,并且已经考虑了数据库的安全性和性能需求。此外,不同的DBMS可能有特定的最佳实践和配置要求,因此建议查阅相关DBMS的官方文档以获取更详细和准确的信息。
|
14天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
52 10
|
14天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
84 6
|
1天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
|
3天前
|
SQL 缓存 数据库
sql 数据库优化
SQL数据库优化是一个复杂且关键的过程,涉及多个层面的技术和策略。以下是一些主要的优化建议: 查询语句优化: 避免全表扫描:在查询时,尽量使用索引来减少全表扫描,提高查询速度。 使用合适的子查询方式:子查询可能降低查询效率,但可以通过优化子查询的结构或使用连接(JOIN)替代子查询来提高性能。 简化查询语句:避免不必要的复杂查询,尽量使SQL语句简单明了。 使用EXISTS替代IN:在查询数据是否存在时,使用EXISTS通常比IN更快。 索引优化: 建立合适的索引:对于经常查询的列,如主键和外键,应创建相应的索引。同时,考虑使用覆盖索引来进一步提高性能。 避免过多的索引:虽然索引可以提高查询
|
3天前
|
SQL XML 数据库
sql导入数据库命令
在SQL Server中,数据库导入可通过多种方式实现:1) 使用SSMS的“导入数据”向导从各种源(如Excel、CSV)导入;2) BULK INSERT语句适用于导入文本文件;3) bcp命令行工具进行批量数据交换;4) OPENROWSET函数直接从外部数据源(如Excel)插入数据。在操作前,请记得备份数据库,并可能需对数据进行预处理以符合SQL Server要求。注意不同方法可能依版本和配置而异。
|
11天前
|
SQL 数据库
数据库SQL语言实战(二)
数据库SQL语言实战(二)
|
11天前
|
SQL 关系型数据库 数据库
【后端面经】【数据库与MySQL】SQL优化:如何发现SQL中的问题?
【4月更文挑战第12天】数据库优化涉及硬件升级、操作系统调整、服务器/引擎优化和SQL优化。SQL优化目标是减少磁盘IO和内存/CPU消耗。`EXPLAIN`命令用于检查SQL执行计划,关注`type`、`possible_keys`、`key`、`rows`和`filtered`字段。设计索引时考虑外键、频繁出现在`where`、`order by`和关联查询中的列,以及区分度高的列。大数据表改结构需谨慎,可能需要停机、低峰期变更或新建表。面试中应准备SQL优化案例,如覆盖索引、优化`order by`、`count`和索引提示。优化分页查询时避免大偏移量,可利用上一批的最大ID进行限制。
38 3
|
14天前
|
SQL 监控 数据库
数据库管理与电脑监控软件:SQL代码优化与实践
本文探讨了如何优化数据库管理和使用电脑监控软件以提升效率。通过SQL代码优化,如使用索引和调整查询语句,能有效提高数据库性能。同时,合理设计数据库结构,如数据表划分和规范化,也能增强管理效率。此外,利用Python脚本自动化收集系统性能数据,并实时提交至网站,可实现对电脑监控的实时性和有效性。这些方法能提升信息系统稳定性和可靠性,满足用户需求。
47 0
|
14天前
|
SQL 存储 数据挖掘
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
服务器数据恢复环境: 一台安装windows server操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。 在windows服务器内装有SqlServer数据库。存储空间LUN划分了两个逻辑分区。 服务器故障&初检: 由于未知原因,Sql Server数据库文件丢失,丢失数据涉及到3个库,表的数量有3000左右。数据库文件丢失原因还没有查清楚,也不能确定数据存储位置。 数据库文件丢失后服务器仍处于开机状态,所幸没有大量数据写入。 将raid5中所有磁盘编号后取出,经过硬件工程师检测,没有发现明显的硬件故障。以只读方式将所有磁盘进行扇区级的全盘镜像,镜像完成后将所
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例