SQL Server迁移登录名没有密码的解决方案
来源:互联网 发布:哪个软件直播笑傲江湖 编辑:程序博客网 时间:2024/05/02 05:05
一、问题
年初时候公司将SQL Server2005全部下线,计划将数据库迁移至SQL Server2008中。但是由于应用搭建时间非常久远,维护人员又交接了多次,因此应用配置里无法更改登录名的密码(所以数据库里也不能改密码),也没有人知道密码是什么,我还需要将数据库连同登录名一起迁移至新环境。面对不知道密码还需迁移数据库的情况,我在微软官网上找到了解决方式,将步骤写在下面。
年初时候公司将SQL Server2005全部下线,计划将数据库迁移至SQL Server2008中。但是由于应用搭建时间非常久远,维护人员又交接了多次,因此应用配置里无法更改登录名的密码(所以数据库里也不能改密码),也没有人知道密码是什么,我还需要将数据库连同登录名一起迁移至新环境。面对不知道密码还需迁移数据库的情况,我在微软官网上找到了解决方式,将步骤写在下面。
二、解决方法
微软官方方法是:https://support.microsoft.com/zh-cn/kb/918992
以下是根据微软官方给出的简易流程。
1.我是从A数据库服务器将登录名和密码迁移至B服务器中。在A中执行以下代码:
微软官方方法是:https://support.microsoft.com/zh-cn/kb/918992
以下是根据微软官方给出的简易流程。
1.我是从A数据库服务器将登录名和密码迁移至B服务器中。在A中执行以下代码:
USE masterGOIF OBJECT_ID ('sp_hexadecimal') IS NOT NULL DROP PROCEDURE sp_hexadecimalGOCREATE PROCEDURE sp_hexadecimal @binvalue varbinary(256), @hexvalue varchar (514) OUTPUTASDECLARE @charvalue varchar (514)DECLARE @i intDECLARE @length intDECLARE @hexstring char(16)SELECT @charvalue = '0x'SELECT @i = 1SELECT @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 + 1ENDSELECT @hexvalue = @charvalueGO IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL DROP PROCEDURE sp_help_revloginGOCREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL ASDECLARE @name sysnameDECLARE @type varchar (1)DECLARE @hasaccess intDECLARE @denylogin intDECLARE @is_disabled intDECLARE @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_nameOPEN login_cursFETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denyloginIF (@@fetch_status = -1)BEGIN PRINT 'No login(s) found.' CLOSE login_curs DEALLOCATE login_curs RETURN -1ENDSET @tmpstr = '/* sp_help_revlogin script 'PRINT @tmpstrSET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'PRINT @tmpstrPRINT ''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 ENDCLOSE login_cursDEALLOCATE login_cursRETURN 0GO
2.执行EXEC sp_help_revlogin 存储过程。
3.存储过程执行后可以看到生成很多结果,复制这些文本,找到对应的用户名的那一块,在B中执行即可。
此时,这个登录名密码就迁移至B中了。这种迁移方式有两点好处:一方面不需要知晓登录名的密码就可以迁移;另一方面不会产生孤立用户的问题。
1 0
- SQL Server迁移登录名没有密码的解决方案
- SQL Server向Oracle迁移的解决方案
- SQL Server以windows验证登录之后,修改sa密码,不能用sa登录的解决方案
- 为 Microsoft SQL Server 登录名添加或更改密码。
- sql server 登录名密码丢失(忘记…
- sql server 2005的登录名
- sql server 2005的默认登录名
- SQL server 创建登录名
- SQL Server将数据库的用户名映射到登录名
- Sql Server用户名和登录名的关系总结
- Sql Server用户名和登录名的关系总结
- sql server登录名与数据库用户名dbo的差别
- Sql Server用户名和登录名的关系总结
- sql server登录名与数据库用户名dbo的差别
- Sql Server用户名和登录名的关系总结
- Sql Server用户名和登录名的关系总结
- SQL Server将数据库的用户名映射到登录名
- Sql Server用户名和登录名的关系总结
- java虚拟机常量池
- 唐骏:身价10亿不买房 每月12万住宾馆
- C-结构
- OJ3377数据结构实验之查找五:平方之哈希表
- 水平居中总结-不定宽块状元素方法
- SQL Server迁移登录名没有密码的解决方案
- Debugging segmentation fault
- 数论--简述同余关系及其部分性质
- 谈谈Android里的Context的使用!
- OC篇--数据类型
- u-boot-2016.05移植:(5)、支持DM9000网卡
- 使用JDBC对数据库进行CRUD
- wireshark怎么抓包、wireshark抓包详细图文教程
- easyUI批量删除,向后台传数组