Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Перенос базы с 2008 Р2 на 2005. Возможно?  [new]
alljoke
Member

Откуда:
Сообщений: 85
Всем доброго времени. Вопрос собственно в теме. Может есть какие-нибудь конверторы? При восстановлении из бэкапа (который был создан на 2008 Р2) в базу на 2005 скуле выдаёт ошибку:

http://screencast.com/t/igGuAXVAud0
5 май 12, 12:00    [12512623]     Ответить | Цитировать Сообщить модератору
 Re: Перенос базы с 2008 Р2 на 2005. Возможно?  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
alljoke,

а смысл?
Зачем переходить с 2008 на 2005?
Он что, лучше?
5 май 12, 12:09    [12512693]     Ответить | Цитировать Сообщить модератору
 Re: Перенос базы с 2008 Р2 на 2005. Возможно?  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33991
Блог
Скриптуете объекты и переносите. Данные также, либо через SSIS.
5 май 12, 12:12    [12512716]     Ответить | Цитировать Сообщить модератору
 Re: Перенос базы с 2008 Р2 на 2005. Возможно?  [new]
alljoke
Member

Откуда:
Сообщений: 85
Да дело в том, что скульный 2008 Р2 сервак стоит в нашей сети, а 2005 в агентстве, т.е. в другой сети. Юзеры работать не могут, четт там беды с сетью. Начальством было решено перевезти всё назад, до осени мол потерпят. Вот и мучаемся теперь. Думал может конверторы есть какие нить.
5 май 12, 12:42    [12512946]     Ответить | Цитировать Сообщить модератору
 Re: Перенос базы с 2008 Р2 на 2005. Возможно?  [new]
alljoke
Member

Откуда:
Сообщений: 85
Критик,
что такое SSIS, можно подробнее?
5 май 12, 12:43    [12512949]     Ответить | Цитировать Сообщить модератору
 Re: Перенос базы с 2008 Р2 на 2005. Возможно?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
alljoke
Критик,
что такое SSIS, можно подробнее?

http://msdn.microsoft.com/ru-ru/library/ms141026.aspx
5 май 12, 13:37    [12513369]     Ответить | Цитировать Сообщить модератору
 Re: Перенос базы с 2008 Р2 на 2005. Возможно?  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33991
Блог
http://en.wikipedia.org/wiki/SQL_Server_Integration_Services
5 май 12, 13:37    [12513373]     Ответить | Цитировать Сообщить модератору
 Re: Перенос базы с 2008 Р2 на 2005. Возможно?  [new]
gang
Member

Откуда:
Сообщений: 1394
Поднять тот что 2005 до 2008 не вариант?
5 май 12, 17:02    [12514796]     Ответить | Цитировать Сообщить модератору
 Re: Перенос базы с 2008 Р2 на 2005. Возможно?  [new]
Игорь Бобак
Member

Откуда:
Сообщений: 424
Вот так всегда - пока сам не сделаешь...

короче, алгоритм такой:
1) в management studio делаете скрипт базы на sql2008 (tasks->generate script).
создаете им базу на sql2005 - будет такая же по структуре, только пустая.
2) теперь надо как-то перенести данные. но если будете здесь слушать тех, кто говорит "пользуйся SSIS" или "Export/Import", то получите фигу, а не перенос: оно обязательно вас поматерит, что нету ключей и т.д., так как не может оно само догадается в каком порядке таблицы переносить. А еще в базе есть identity поля - думаю понятно что будет при таком переносе.
Так что делаем перенос в правильном порядке:
а) создаем linked server из sql2005 на sql2008
б) запускаем скрипт на вашей пустой базе на sql2005

if exists (select 1 from sys.objects where object_id = object_id('fnFieldList'))
	drop function fnFieldList
go
	
create function dbo.fnFieldList(@tablename sysname) 
returns nvarchar(max)
as
begin
	declare @fieldList nvarchar(max)
	select @fieldList = '('
	select @fieldList  = @fieldList  + name + ', '
		from sys.columns where object_id = object_id(@tablename)
	select 	@fieldList  = substring(@fieldList, 1, len(@fieldList) - 1) + ')'
	return @fieldList  
end
go

-- create 2 helper tables: #tables and #deleteorder 
if exists(select * from tempdb.dbo.sysobjects where name like '#tables%') 
	drop table #tables
go

create table #tables(
 	id int,               -- id of the table
	name varchar(255),    -- name of the table
	refOnMe int           -- how many other tables are referencing this one
)
go

if exists(select * from tempdb.dbo.sysobjects where name like '#deleteorder%') 
	drop table #deleteorder
go

create table #deleteorder(
 	id int,               -- id of the table
	name varchar(255),    -- name of the table
	delorder int          -- deleting order
)
go

-- build the ordered sequence of all user tables and store it in #deleteorder
set nocount on

declare @order as int, @rc int
select @order=1

while 0=0
begin
	delete from #tables
	
	insert into #tables
	select 
		id, 
		name, 
		(select count(*) 
		from sysreferences r1 
		where 
			r1.rkeyid = so.id and
			r1.fkeyid not in (select id from #deleteorder)
			and r1.rkeyid <> r1.fkeyid  -- it was annoying bug: table had a reference on itself;
			-- searched for an hour until understood why it is not inserted
		) as refonme
	from sysobjects so
	where 
		so.xtype = 'u' 
		and so.name <> 'dtproperties'
		and so.id not in (select id from #deleteorder)
	
	select @rc  = @@rowcount
	
	if @rc=0 and @order>1 
		break

	insert #deleteorder
	select id, name, @order 
	from #tables where refOnMe = 0
	select @rc  = @@rowcount
	
	select @order = @order+1
end
set nocount off

declare @script nvarchar(max)
-- select * from #deleteorder order by delorder desc

-- I was TOO LAZY to detect which table has identity, and which has not,
-- so you may get several annoying messages that "this table doesn't have identity" bla, bla, bla...
declare cur cursor for 
select 
	cast('SET IDENTITY_INSERT ' as nvarchar(max)) + name + ' ON' + char(13)+ char(10)
	+'go'+ char(13)+ char(10)
	+'insert into ' + name + dbo.fnFieldList(name) + char(13)+ char(10)
	+'select * from  [ANDROMEDA\SQL2008].BAT.dbo.'+name + char(13)+ char(10)
	+'go'+ char(13)+ char(10)
	+'SET IDENTITY_INSERT ' + name + ' OFF' + char(13)+ char(10)
	+'go'+ char(13)+ char(10)
	+ char(13)+ char(10)
from #deleteorder order by delorder desc

open cur
fetch cur into @script
while @@fetch_status = 0
begin
	print @script
	fetch cur into @script
end
close cur
deallocate cur

drop table #tables
drop table #deleteorder


только поменяйте у себя [ANDROMEDA\SQL2008].BAT на ваше название сервера и базы откуда берутся данные.
Запустив этот скрипт вы получите пачку запросов типа

SET IDENTITY_INSERT tblUsers ON
go
insert into tblUsers(usrID, usrLogin, usrPassword, usrNameFirst, usrNameLast, usrEmail, usrPhone, usrNotes, usrStatus, usrCanUpdateOwnInfo, usrUC, usrDC, usrUM, usrDM, usrWindowsLogin, usrWindowsDomain, usrIsBindedToWindowsAccount)
select * from  [ANDROMEDA\SQL2008].BAT.dbo.tblUsers
go
SET IDENTITY_INSERT tblUsers OFF
go


которые идут в ПРАВИЛЬНОМ порядке и переносят данные из sql2008 в sql2005.
мне было лень писать определитель того, есть ли identity поле, так что если оно немного поматерится что его нету - не обращайте внимания.

в) запустите полученный скрипт на sql2005. Он перенесет ваши данные.

P.S.
говорю сразу - скрипт не "причесывал", воспользовавшись своей старой наработкой https://www.sql.ru/forum/actualthread.aspx?tid=28904 еще для 2000 сервера. понятно что для красоты надо было читать данные из sys.objects вместо sysobjects, но думаю что это не важно
19 апр 13, 18:09    [14206030]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить