经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MS SQL Server » 查看文章
SQL Server Alwayson 主从数据库账号同步
来源:cnblogs  作者:东山絮柳仔  时间:2019/5/21 9:22:21  对本文有异议

我们建立了Alwayson后,辅助副本下的数据库是没有相应的账号的,怎么样进行账号的同步呢?怎么在不知道密码的情况下,进行账号的同步设置。

 

我们可以通过SP--sp_help_revlogin 来实现,此存储过程在主副本上创建了,在执行的时候直接数据你需要同步的账号就会生成创建的SQL命令。

我们将这个SQL 命令 Copy至辅助副本上去执行,然后辅助副本上关于这个账号就生效了。

 

 

SP-- sp_help_revlogin的完整代码如下(需先创建sp_hexadecimal,代码随后)

  1. USE [master]
  2. GO
  3. /****** Object: StoredProcedure [dbo].[sp_help_revlogin] Script Date: 2016/12/9 16:21:57 ******/
  4. SET ANSI_NULLS ON
  5. GO
  6. SET QUOTED_IDENTIFIER ON
  7. GO
  8. Create PROCEDURE [dbo].[sp_help_revlogin] @login_name sysname = NULL AS
  9. DECLARE @name sysname
  10. DECLARE @type varchar (1)
  11. DECLARE @hasaccess int
  12. DECLARE @denylogin int
  13. DECLARE @is_disabled int
  14. DECLARE @PWD_varbinary varbinary (256)
  15. DECLARE @PWD_string varchar (514)
  16. DECLARE @SID_varbinary varbinary (85)
  17. DECLARE @SID_string varchar (514)
  18. DECLARE @tmpstr varchar (1024)
  19. DECLARE @is_policy_checked varchar (3)
  20. DECLARE @is_expiration_checked varchar (3)
  21.  
  22. DECLARE @defaultdb sysname
  23. IF (@login_name IS NULL)
  24. DECLARE login_curs CURSOR FOR
  25.  
  26. SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM
  27. sys.server_principals p LEFT JOIN sys.syslogins l
  28. ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name <> 'sa'
  29. ELSE
  30. DECLARE login_curs CURSOR FOR
  31.  
  32.  
  33. SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM
  34. sys.server_principals p LEFT JOIN sys.syslogins l
  35. ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name = @login_name
  36. OPEN login_curs
  37.  
  38. FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
  39. IF (@@fetch_status = -1)
  40. BEGIN
  41. PRINT 'No login(s) found.'
  42. CLOSE login_curs
  43. DEALLOCATE login_curs
  44. RETURN -1
  45. END
  46. SET @tmpstr = '/* sp_help_revlogin script '
  47. PRINT @tmpstr
  48. SET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'
  49. PRINT @tmpstr
  50. PRINT ''
  51. WHILE (@@fetch_status <> -1)
  52. BEGIN
  53. IF (@@fetch_status <> -2)
  54. BEGIN
  55. PRINT ''
  56. SET @tmpstr = '-- Login: ' + @name
  57. PRINT @tmpstr
  58. IF (@type IN ( 'G', 'U'))
  59. BEGIN -- NT authenticated account/group
  60.  
  61. SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ']'
  62. END
  63. ELSE BEGIN -- SQL Server authentication
  64. -- obtain password and sid
  65. SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) )
  66. EXEC sp_hexadecimal @PWD_varbinary, @PWD_string OUT
  67. EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
  68. -- obtain password policy state
  69. 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
  70. 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
  71. SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + ']'
  72.  
  73. IF ( @is_policy_checked IS NOT NULL )
  74. BEGIN
  75. SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked
  76. END
  77. IF ( @is_expiration_checked IS NOT NULL )
  78. BEGIN
  79. SET @tmpstr = @tmpstr + ', CHECK_EXPIRATION = ' + @is_expiration_checked
  80. END
  81. END
  82. IF (@denylogin = 1)
  83. BEGIN -- login is denied access
  84. SET @tmpstr = @tmpstr + '; DENY CONNECT SQL TO ' + QUOTENAME( @name )
  85. END
  86. ELSE IF (@hasaccess = 0)
  87. BEGIN -- login exists but does not have access
  88. SET @tmpstr = @tmpstr + '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name )
  89. END
  90. IF (@is_disabled = 1)
  91. BEGIN -- login is disabled
  92. SET @tmpstr = @tmpstr + '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE'
  93. END
  94. PRINT @tmpstr
  95. END
  96.  
  97. FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
  98. END
  99. CLOSE login_curs
  100. DEALLOCATE login_curs
  101. RETURN 0

  

注意其上的SP在代码中会包含sp --sp_hexadecimal,需要先创建

  1. USE [master]
  2. GO
  3.  
  4. /****** Object: StoredProcedure [dbo].[sp_hexadecimal] Script Date: 2016/12/9 16:11:25 ******/
  5. SET ANSI_NULLS ON
  6. GO
  7.  
  8. SET QUOTED_IDENTIFIER ON
  9. GO
  10.  
  11. CREATE PROCEDURE [dbo].[sp_hexadecimal]
  12. @binvalue varbinary(256),
  13. @hexvalue varchar (514) OUTPUT
  14. AS
  15. DECLARE @charvalue varchar (514)
  16. DECLARE @i int
  17. DECLARE @length int
  18. DECLARE @hexstring char(16)
  19. SELECT @charvalue = '0x'
  20. SELECT @i = 1
  21. SELECT @length = DATALENGTH (@binvalue)
  22. SELECT @hexstring = '0123456789ABCDEF'
  23. WHILE (@i <= @length)
  24. BEGIN
  25. DECLARE @tempint int
  26. DECLARE @firstint int
  27. DECLARE @secondint int
  28. SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
  29. SELECT @firstint = FLOOR(@tempint/16)
  30. SELECT @secondint = @tempint - (@firstint*16)
  31. SELECT @charvalue = @charvalue +
  32. SUBSTRING(@hexstring, @firstint+1, 1) +
  33. SUBSTRING(@hexstring, @secondint+1, 1)
  34. SELECT @i = @i + 1
  35. END
  36.  
  37. SELECT @hexvalue = @charvalue
  38.  
  39. GO

  

原文链接:http://www.cnblogs.com/xuliuzai/p/10895193.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号