Masalah ini terjadi karena Anda lakukan tidak mentransfer
login dan sandi dari contoh SQL Server di server A ke contoh SQL Server di
server B.
Untuk mentransfer login, gunakan salah satu metode berikut,
yang sesuai untuk situasi Anda.
Metode 1: Log in dengan menggunakan pra-SQL Server 2000
sandi
Untuk mengatasi masalah ini, minta pengguna untuk masuk
ke server yang menjalankan SQL Server dengan menggunakan pra-SQL Server 2000
login.
Catatan Menerapkan
algoritma sandi akan diperbarui secara otomatis ketika pengguna log in dengan
menggunakan pra-SQL Server 2000 sandi.
Metode 2: Reset sandi di SQL Server
Untuk mengatasi masalah ini, reset sandi di SQL Server,
dan kemudian script keluar login.
Catatan Sandi
hashing algoritma digunakan ketika Anda me-reset sandi.
Metode 3: Membuat log pada skrip yang memiliki sandi
kosong
Untuk membuat log pada skrip yang memiliki sandi kosong,
ikuti langkah-langkah berikut:
1. Server A, mulai SQL
Server Management Studio, dan kemudian Sambungkan ke SQL Server dari mana Anda
memindahkan pangkalan data.
2. Buka jendela Editor kueri
baru, dan kemudian jalankan skrip berikut ini.
3.
USE master
4.
GO
5.
IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
6.
DROP PROCEDURE
sp_hexadecimal
7.
GO
8.
CREATE PROCEDURE sp_hexadecimal
9.
@binvalue
varbinary(256),
10. @hexvalue varchar (514) OUTPUT
11. AS
12. DECLARE @charvalue varchar
(514)
13. DECLARE @i int
14. DECLARE @length int
15. DECLARE @hexstring char(16)
16. SELECT @charvalue = '0x'
17. SELECT @i = 1
18. SELECT @length = DATALENGTH
(@binvalue)
19. SELECT @hexstring =
'0123456789ABCDEF'
20. WHILE (@i <= @length)
21. BEGIN
22. DECLARE @tempint int
23. DECLARE @firstint int
24. DECLARE @secondint int
25. SELECT @tempint = CONVERT(int,
SUBSTRING(@binvalue,@i,1))
26. SELECT @firstint = FLOOR(@tempint/16)
27. SELECT @secondint = @tempint - (@firstint*16)
28. SELECT @charvalue = @charvalue +
29. SUBSTRING(@hexstring, @firstint+1, 1) +
30. SUBSTRING(@hexstring, @secondint+1, 1)
31. SELECT @i = @i + 1
32. END
33.
34. SELECT @hexvalue = @charvalue
35. GO
36.
37. IF OBJECT_ID ('sp_help_revlogin')
IS NOT NULL
38. DROP PROCEDURE sp_help_revlogin
39. GO
40. CREATE PROCEDURE
sp_help_revlogin @login_name sysname = NULL AS
41. DECLARE @name sysname
42. DECLARE @type varchar (1)
43. DECLARE @hasaccess int
44. DECLARE @denylogin int
45. DECLARE @is_disabled int
46. DECLARE @PWD_varbinary varbinary (256)
47. DECLARE @PWD_string varchar (514)
48. DECLARE @SID_varbinary
varbinary (85)
49. DECLARE @SID_string varchar
(514)
50. DECLARE @tmpstr varchar (1024)
51. DECLARE @is_policy_checked
varchar (3)
52. DECLARE
@is_expiration_checked varchar (3)
53.
54. DECLARE @defaultdb sysname
55.
56. IF (@login_name IS NULL)
57. DECLARE login_curs CURSOR FOR
58.
59. SELECT p.sid, p.name, p.type,
p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM
60. sys.server_principals p LEFT
JOIN sys.syslogins l
61. ON ( l.name = p.name ) WHERE p.type IN (
'S', 'G', 'U' ) AND p.name <> 'sa'
62. ELSE
63. DECLARE login_curs CURSOR FOR
64.
65.
66. SELECT p.sid, p.name, p.type,
p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM
67. sys.server_principals p LEFT
JOIN sys.syslogins l
68. ON ( l.name = p.name ) WHERE p.type IN (
'S', 'G', 'U' ) AND p.name = @login_name
69. OPEN login_curs
70.
71. FETCH NEXT FROM login_curs
INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess,
@denylogin
72. IF (@@fetch_status = -1)
73. BEGIN
74. PRINT 'No login(s) found.'
75. CLOSE login_curs
76. DEALLOCATE login_curs
77. RETURN -1
78. END
79. SET @tmpstr = '/*
sp_help_revlogin script '
80. PRINT @tmpstr
81. SET @tmpstr = '** Generated '
+ CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'
82. PRINT @tmpstr
83. PRINT ''
84. WHILE (@@fetch_status
<> -1)
85. BEGIN
86. IF (@@fetch_status <> -2)
87. BEGIN
88. PRINT ''
89. SET @tmpstr = '-- Login: ' + @name
90. PRINT @tmpstr
91. IF (@type IN ( 'G', 'U'))
92. BEGIN -- NT authenticated account/group
93.
94. SET @tmpstr = 'CREATE LOGIN ' +
QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb +
']'
95. END
96. ELSE BEGIN -- SQL Server authentication
97. -- obtain password and sid
98. SET @PWD_varbinary = CAST(
LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) )
99. EXEC sp_hexadecimal @PWD_varbinary,
@PWD_string OUT
100. EXEC sp_hexadecimal
@SID_varbinary,@SID_string OUT
101.
102. -- obtain password policy state
103. 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
104. 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
105.
106. SET @tmpstr = 'CREATE LOGIN ' +
QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' +
@SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + ']'
107.
108. IF ( @is_policy_checked IS NOT NULL )
109. BEGIN
110. SET @tmpstr = @tmpstr + ',
CHECK_POLICY = ' + @is_policy_checked
111. END
112. IF ( @is_expiration_checked IS NOT NULL
)
113. BEGIN
114. SET @tmpstr = @tmpstr + ',
CHECK_EXPIRATION = ' + @is_expiration_checked
115. END
116. END
117. IF (@denylogin = 1)
118. BEGIN
-- login is denied access
119. SET @tmpstr = @tmpstr + '; DENY CONNECT
SQL TO ' + QUOTENAME( @name )
120. END
121. ELSE IF (@hasaccess = 0)
122. BEGIN -- login exists but does not have
access
123. SET @tmpstr = @tmpstr + '; REVOKE CONNECT
SQL TO ' + QUOTENAME( @name )
124. END
125. IF (@is_disabled = 1)
126. BEGIN -- login is disabled
127. SET @tmpstr = @tmpstr + '; ALTER LOGIN '
+ QUOTENAME( @name ) + ' DISABLE'
128. END
129. PRINT @tmpstr
130. END
131.
132. FETCH NEXT FROM login_curs INTO
@SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
133. END
134. CLOSE login_curs
135. DEALLOCATE login_curs
136. RETURN 0
137. GO
CatatanSkrip ini membuat dua
prosedur yang tersimpan dalam master database. Prosedur yang bernamasp_hexadecimal dan sp_help_revlogin.
138.Jalankan pernyataan
berikut ini:
EXEC sp_help_revlogin
Skrip output yang
menghasilkan sp_help_revlogin disimpan prosedur adalah
skrip login. Skrip login ini membuat
login yang asli pengidentifikasi kemanan (SID) dan sandi asli.
139.Di server B, mulai SQL Server
Management Studio, dan kemudian Sambungkan ke SQL Server di mana Anda
memindahkan pangkalan data.
Penting
140.Buka jendela Editor kueri
baru, dan kemudian menjalankan skrip output yang dibuat di langkah 3.
Komentar
Tinjau informasi berikut sebelum Anda menjalankan skrip
output pada contoh di server B:
·
Jika Anda mencoba untuk membuat login SQL
Server 2012 baru menggunakan pra-SQL Server 2000 login yang telah diatur, Anda
menerima galat berikut ini:
MSG 15021, tingkat 16,
negara bagian 2, baris 1
Invalid
nilai yang diberikan untuk parameter sandi.
Catatan
Untuk
mengatasi masalah ini di server yang menjalankan SQL Server 2012, buat login
yang memiliki sandi kosong.
CREATE LOGIN [Test] WITH PASSWORD = '', SID =
0x90FD605DCEFAE14FAB4D5EB0BBA1AECC,
DEFAULT_DATABASE = [master], CHECK_POLICY = ON, CHECK_EXPIRATION = OFF
Setelah
Anda membuat login yang memiliki sandi kosong, pengguna dapat mengubah sandi
pada upaya masuk berikutnya.
·
Sandi dapat hashed dalam tiga cara:
·
VERSION_LEGACY: hash ini adalah hash
16-byte pra-SQL Server 2000.
·
VERSION_SHA1: hash ini dibuat dengan
menggunakan algoritma SHA1 dan digunakan di SQL Server 2000 melalui SQL Server
2008 R2.
·
VERSION_SHA2: hash ini dibuat dengan
menggunakan algoritma SHA2 512 dan digunakan dalam SQL Server 2012.
·
Pada SQL Server 2008 R1 dan versi yang
lebih lawas, pra-SQL Server 2000 sandi hash yang didukung.
·
Jika pengguna yang memiliki sandi yang
menggunakan pra-SQL Server 2000 hash ada di server yang menjalankan SQL Server
2008 R2, ini berarti bahwa pengguna telah tidak masuk ke server.
·
Meninjau skrip output dengan seksama. Jika server A dan server
B berada di domain yang berbeda, Anda harus mengubah skrip output. Kemudian, Anda harus
mengganti nama domain asli dengan menggunakan nama domain baru pada LOGIN
membuat laporan. Login terpadu yang
diberikan akses di domain baru tidak memiliki SID sama sebagai login di domain
yang asli. Oleh karena itu, pengguna
yang ditinggalkan dari login ini. Untuk informasi
selengkapnya tentang cara menyelesaikan pengguna ditinggalkan ini, klik nomor
artikel berikut ini untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
240872 Cara menyelesaikan
masalah izin saat Anda memindahkan pangkalan data antara server yang menjalankan
SQL Server
Jika server A dan server
B di domain yang sama, SID sama digunakan. Oleh karena itu, pengguna
tidak mungkin dapat ditinggalkan.
·
Dalam output skrip login dibuat dengan
menggunakan sandi yang dienkripsi. Hal ini karena argumen
HASHED dalam LOGIN membuat pernyataan. Argumen ini menentukan
bahwa sandi yang dimasukkan setelah argumen sandi telah hashed.
·
Secara default, hanya merupakan anggota
dari peran sysadmin tetap server dapat
menjalankan pernyataan SELECT dari tampilan sys.server_principals . Kecuali anggota sysadmin tetap peran server
memberikan izin yang diperlukan untuk pengguna, pengguna tidak dapat membuat
atau menjalankan skrip output.
·
Langkah-langkah dalam artikel ini tidak
mentransfer informasi database default untuk masuk tertentu. Hal ini karena pangkalan
data asali mungkin tidak selalu ada di server B. Untuk menentukan
pangkalan data asali untuk login, gunakan pernyataan mengubah LOGIN oleh lewat
di nama login dan pangkalan data asali sebagai argumen.
·
Case-sensitive A sensitif server dan B: urutan server A mungkin
case-sensitive, dan urutan server B mungkin sensitif.Dalam hal ini, pengguna
harus mengetik sandi di semua huruf setelah Anda mentransfer login dan sandi
untuk contoh di server B.
Sensitif
A case-sensitive server dan B: urutan server A mungkin sensitif, dan
urutan server B mungkin case-sensitive.Dalam hal ini, pengguna tidak dapat
masuk menggunakan login dan sandi yang Anda mentransfer ke contoh di server B
kecuali jika salah satu dari kondisi berikut ini benar:
·
Sandi asli berisi surat tidak ada.
·
Semua huruf dalam sandi asli adalah huruf.
Sensitif atau
case-sensitive pada kedua server: urutan server A dan server B mungkin
sensitif, atau urutan server A dan server B mungkin case-sensitive. Dalam kasus ini, pengguna
tidak mengalami masalah.
·
Login yang sudah ada di contoh di server B
mungkin memiliki nama yang sama dengan nama dalam skrip output. Dalam hal ini, Anda
menerima pesan galat ketika Anda menjalankan skrip output pada contoh di server
B:
MSG 15025, tingkat 16,
negara bagian 1, baris 1
Server
pimpinan 'MyLogin' sudah ada.
Demikian pula, login yang
sudah ada di contoh di server B bisa SID yang sama dengan SID dalam skrip
output. Dalam hal ini, Anda
menerima pesan galat ketika Anda menjalankan skrip output pada contoh di server
B:
MSG 15433, tingkat 16,
negara bagian 1, baris 1
Parameter
disediakan sid yang digunakan.
Oleh karena itu, Anda
harus melakukan hal berikut ini:
1. Meninjau skrip output
dengan seksama.
2. Periksa konten tampilan sys.server_principals dalam contoh di server B.
3. Alamat pesan galat ini
yang sesuai.
SQL Server 2005, SID for login digunakan
untuk menerapkan database tingkat akses. Login mungkin memiliki
SID berbeda dalam database yang berbeda di server. Dalam hal ini, login
hanya dapat mengakses pangkalan data yang telah SID yang cocok dengan SID dalam
tampilan sys.server_principals . Masalah ini dapat terjadi
jika dua database gabungan dari server yang berbeda. Untuk
mengatasi masalah ini, secara manual menghapus login dari pangkalan data yang
telah ketidakcocokan SID menggunakan pernyataan DROP pengguna. Kemudian, tambahkan login
lagi menggunakan pernyataan membuat pengguna.