Po przeniesieniu z jednej instancji na drugą baz danych w MS SQL Server 2000 należy wykonąc kolejne czynności:

1. Przeniesienie do Security: Logins, Server Roles, User Mapping.

Na stronie Microsoftu „How to transfer logins and passwords between instances of SQL Server” znajduje się artykuł na ten temat.

Opisane są tam dwie metody:

metoda 1: przedstawia dwie procedury składowane sp_hexadecimal i sp_help_revlogin. Uruchamia się skrypt z poziomu bazy master.

Skrypt ten generuje kod tworzący loginy. Przystosowany jest on do przenoszenia loginów z wersji 2000 na wersję 2000 !!!

metoda 2: przedstawia dwie procedury składowane sp_hexadecimal i sp_help_revlogin_2000_to_2005. Uruchamia się skrypt z poziomu bazy master.

Skrypt ten generuje kod tworzący loginy, defaultowe bazy i role. Przystosowany jest on do przenoszenia loginów z wersji 2000 na wersję 2005 !!!

Po odpowiedniej modifikacji tych dwóch skryptów stworzyłem:

metoda 3: przedstawia dwie procedury składowane sp_hexadecimal i sp_help_revlogin_2000_to_2000_DBrejnak. Uruchamia się skrypt z poziomu bazy master.

Skrypt ten generuje kod tworzący loginy, defaultowe bazy i role. Przystosowany jest on do przenoszenia loginów z wersji 2000 na wersję 2000 !!!

001-- Script     : sp_help_revlogin_2000_to_2000_DBrejnak .sql
002-- Created    : Microsoft
003-- Modified   : Dariusz Brejnak aka `DBSoft (c) 2010   -  2010-08-26
004----------------------------------------------------------------------------------------
005USE master
006GO
007IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
008DROP PROCEDURE sp_hexadecimal
009GO
010CREATE PROCEDURE sp_hexadecimal
011@binvalue varbinary(256),
012@hexvalue varchar(256) OUTPUT
013AS
014DECLARE @charvalue varchar(256)
015DECLARE @i int
016DECLARE @length int
017DECLARE @hexstring char(16)
018SELECT @charvalue = '0x'
019SELECT @i = 1
020SELECT @length = DATALENGTH (@binvalue)
021SELECT @hexstring = '0123456789ABCDEF'
022WHILE (@i <= @length)
023BEGIN
024DECLARE @tempint int
025DECLARE @firstint int
026DECLARE @secondint int
027SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
028SELECT @firstint = FLOOR(@tempint/16)
029SELECT @secondint = @tempint - (@firstint*16)
030SELECT @charvalue = @charvalue +
031SUBSTRING(@hexstring, @firstint+1, 1) +
032SUBSTRING(@hexstring, @secondint+1, 1)
033SELECT @i = @i + 1
034END
035SELECT @hexvalue = @charvalue
036GO
037 
038IF OBJECT_ID ('sp_help_revlogin_2000_to_2000_DBrejnak') IS NOT NULL
039DROP PROCEDURE sp_help_revlogin_2000_to_2000_DBrejnak
040GO
041CREATE PROCEDURE sp_help_revlogin_2000_to_2000_DBrejnak
042 
043@login_name sysname = NULL,
044@include_db bit = 0,
045@include_role bit = 0
046 
047AS
048DECLARE @name sysname
049DECLARE @xstatus int
050DECLARE @binpwd varbinary (256)
051DECLARE @dfltdb varchar (256)
052DECLARE @txtpwd sysname
053DECLARE @tmpstr varchar (256)
054DECLARE @SID_varbinary varbinary(85)
055DECLARE @SID_string varchar(256)
056 
057IF (@login_name IS NULL)
058DECLARE login_curs CURSOR STATIC FOR
059SELECT sid, [name], xstatus, password, isnull(db_name(dbid), 'master')
060FROM master.dbo.sysxlogins
061WHERE srvid IS NULL AND
062[name] <> 'sa'
063ELSE
064DECLARE login_curs CURSOR FOR
065SELECT sid, [name], xstatus, password, isnull(db_name(dbid), 'master')
066FROM master.dbo.sysxlogins
067WHERE srvid IS NULL AND
068[name] = @login_name
069 
070OPEN login_curs
071 
072FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd, @dfltdb
073 
074IF (@@fetch_status = -1)
075BEGIN
076PRINT 'No login(s) found.'
077CLOSE login_curs
078DEALLOCATE login_curs
079RETURN -1
080END
081----------------------------------
082SET @tmpstr = '/* sp_help_revlogin_2000_to_2000_DBrejnak script '
083PRINT @tmpstr
084SET @tmpstr = '** Generated '
085+ CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'
086PRINT @tmpstr
087PRINT ''
088PRINT 'DECLARE @pwd sysname'
089WHILE (@@fetch_status <> -1)
090BEGIN
091IF (@@fetch_status <> -2)
092BEGIN
093PRINT ''
094SET @tmpstr = '-- Login: ' + @name
095PRINT @tmpstr
096IF (@xstatus & 4) = 4
097BEGIN -- NT authenticated account/group
098IF (@xstatus & 1) = 1
099BEGIN -- NT login is denied access
100SET @tmpstr = 'EXEC master..sp_denylogin ''' + @name + ''''
101PRINT @tmpstr
102END
103ELSE BEGIN -- NT login has access
104SET @tmpstr = 'EXEC master..sp_grantlogin ''' + @name + ''''
105PRINT @tmpstr
106END
107END
108ELSE BEGIN -- SQL Server authentication
109IF (@binpwd IS NOT NULL)
110BEGIN -- Non-null password
111EXEC sp_hexadecimal @binpwd, @txtpwd OUT
112IF (@xstatus & 2048) = 2048
113SET @tmpstr = 'SET @pwd = CONVERT (varchar(256), ' + @txtpwd + ')'
114ELSE
115SET @tmpstr = 'SET @pwd = CONVERT (varbinary(256), ' + @txtpwd + ')'
116PRINT @tmpstr
117EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
118SET @tmpstr = 'EXEC master..sp_addlogin ''' + @name
119+ ''', @pwd, @sid = ' + @SID_string + ', @encryptopt = '
120END
121ELSE BEGIN
122-- Null password
123EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
124SET @tmpstr = 'EXEC master..sp_addlogin ''' + @name
125+ ''', NULL, @sid = ' + @SID_string + ', @encryptopt = '
126END
127IF (@xstatus & 2048) = 2048
128-- login upgraded from 6.5
129SET @tmpstr = @tmpstr + '''skip_encryption_old'''
130ELSE
131SET @tmpstr = @tmpstr + '''skip_encryption'''
132PRINT @tmpstr
133END
134END
135FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd, @dfltdb
136 
137END
138 
139---------------------------------
140IF @include_db = 1
141BEGIN
142PRINT ''
143PRINT ''
144PRINT ''
145PRINT '/***** SET DEFAULT DATABASES *****/'
146 
147FETCH FIRST FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd, @dfltdb
148 
149WHILE @@fetch_status = 0
150BEGIN
151PRINT ''
152SET @tmpstr = '-- Login: ' + @name
153PRINT @tmpstr
154 
155SET @tmpstr = 'EXEC sp_defaultdb [' + @name + '], [' + @dfltdb + ']'
156 
157PRINT @tmpstr
158 
159FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd, @dfltdb
160END
161END
162-----------------------------------------------
163IF @include_role = 1
164BEGIN
165PRINT ''
166PRINT ''
167PRINT ''
168PRINT '/***** SET SERVER ROLES *****/'
169 
170FETCH FIRST FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd, @dfltdb
171 
172WHILE @@fetch_status = 0
173BEGIN
174PRINT ''
175SET @tmpstr = '-- Login: ' + @name
176PRINT @tmpstr
177 
178IF @xstatus &16 = 16 -- sysadmin
179BEGIN
180SET @tmpstr = 'exec master.dbo.sp_addsrvrolemember @loginame=''' + @name + ''', @rolename=''sysadmin'''
181PRINT @tmpstr
182END
183 
184IF @xstatus &32 = 32 -- securityadmin
185BEGIN
186SET @tmpstr = 'exec master.dbo.sp_addsrvrolemember @loginame=''' + @name + ''', @rolename=''securityadmin'''
187PRINT @tmpstr
188END
189 
190IF @xstatus &64 = 64 -- serveradmin
191BEGIN
192SET @tmpstr = 'exec master.dbo.sp_addsrvrolemember @loginame=''' + @name + ''', @rolename=''serveradmin'''
193PRINT @tmpstr
194END
195 
196IF @xstatus &128 = 128 -- setupadmin
197BEGIN
198SET @tmpstr = 'exec master.dbo.sp_addsrvrolemember @loginame=''' + @name + ''', @rolename=''setupadmin'''
199PRINT @tmpstr
200END
201 
202IF @xstatus &256 = 256 --processadmin
203BEGIN
204SET @tmpstr = 'exec master.dbo.sp_addsrvrolemember @loginame=''' + @name + ''', @rolename=''processadmin'''
205PRINT @tmpstr
206END
207 
208IF @xstatus &512 = 512 -- diskadmin
209BEGIN
210SET @tmpstr = 'exec master.dbo.sp_addsrvrolemember @loginame=''' + @name + ''', @rolename=''diskadmin'''
211PRINT @tmpstr
212END
213 
214IF @xstatus &1024 = 1024 -- dbcreator
215BEGIN
216SET @tmpstr = 'exec master.dbo.sp_addsrvrolemember @loginame=''' + @name + ''', @rolename=''dbcreator'''
217PRINT @tmpstr
218END
219 
220IF @xstatus &4096 = 4096 -- bulkadmin
221BEGIN
222SET @tmpstr = 'exec master.dbo.sp_addsrvrolemember @loginame=''' + @name + ''', @rolename=''bulkadmin'''
223PRINT @tmpstr
224END
225 
226FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd, @dfltdb
227END
228END
229 
230CLOSE login_curs
231DEALLOCATE login_curs
232RETURN 0
233GO
234 
235exec sp_help_revlogin_2000_to_2000_DBrejnak @login_name=NULL, @include_db=1, @include_role=1
236GO

Dodatkowe informacje są równiez na stronie Microsoft: „How to transfer the logins and the passwords between instances of SQL Server 2005 and SQL Server 2008”

2. Przeniesienie jobów:

Z poziomu Enterprise Managera w ramach wybranej instancji wchodzimy w Management, następnie wybieramy SQL Server Agent. W nim klikami ppm na Jobs a następnie wybieramy z menu podręcznego „Wszystkie zadania” i dalej „Generate SQL Script”. Po wygenerowaniu skryptu kopiujemy go i uruchamiamy na serwerze docelowym.


Dariusz Brejnak

Od prawie trzydziestu lat jest pasjonatem informatyki, a zwłaszcza dziedzin dotyczących baz danych, hurtowni danych oraz ogólnie rozumianej tematyki BI. Jego druga pasja to fotografia http://dariuszbrejnak.pl