Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > перехват и замена ID поля


Автор: Stranger 7.7.2006, 09:49
Здравствуйте!
работаю с забавной софтиной "фабрика новостей" - используется телекомпаниями для создания текстов к телепрограммам. возможностей прилично - время, роли, пользователи, права и прочие радости жизни.

сейчас планируется переезд и перенос наработанной базы со старой версии (работающей через веб-интерфейс на эмуляторе иксов) на новую (на SQL сервере + независимый собственный клиент).

в установщике идет sql-скрипт, который конфигуряет новую пустую базу. есть процедуры под соответствующими названиями типа "AddToArchNewsFromNF1" и пр... 

беда в том, что у меня старых баз 2 (на разных серверах и для разных отделов), а задача стоит собрать все          в 1 базу и чтобы без потери данных. посредством встроенного разработчиками механизма импорта первая база копируется нормально, без ошибок, а вот вторая на каждую запись ругается "cant insert duplicate key" или "cant insert primary key". дотумкал, что старые базы содержат одинаковые данные (не только ID, на самом деле выяснилось, что N лет назад база была одна, а потом кто-то снял копию, и запустил ее на другом серваке - с этого времени данные в базах начали отличаться).  

Каким образом можно сделать так, чтобы при импорте из старой базы в новую шла проверка на совпадение ключей и в случае, если ключи одинаковые, генерировался новый?

с помощью утилиты SQL Manager 2005 for SQL Server Lite я вполне наглядно могу смотреть все таблицы, процедуры, индексы и прочие компоненты базы,  но к сожалению мне по части SQL "медведъ на ухо наступил" и с программированием очень туго.  

вот процедуры, которые вызываются при импорте: 
Код

CREATE proc AddToArchNewsFromNF1
@id bigint,
@name nvarchar(255),
@editor varchar(255),
@date nvarchar(255),
@hrono bigint,
@description nvarchar(255)
as

Declare @userid int
Select @userid=userid from users where username like @editor
if( @userid is  NULL)
begin
    Set @userid=0
end
INSERT INTO ArcNews
                      (id, Name, EditorId, NewsDate, Description, NewsTime, CalcTime, TaskTime, Deleted, ProgramId)
VALUES     (@id,@name,@userid,convert(datetime,@date),@description,@hrono,0,0,0,1)



Код


CREATE proc AddToNewsFromNF1
@id bigint,
@name nvarchar(255),
@editor varchar(255),
@date nvarchar(255),
@hrono bigint,
@description nvarchar(255)
as

Declare @userid int
Select @userid=userid from users where username like @editor
if( @userid is  NULL)
begin
    Set @userid=0
end
INSERT INTO News
                      (id, Name, EditorId, NewsDate, Description, NewsTime, CalcTime, TaskTime, Deleted, ProgramId)
VALUES     (@id,@name,@userid,convert(datetime,@date),@description,@hrono,0,0,0,1)


Код

CREATE proc InsetIntoArchBlocsFromNF2
@id bigint,
@name nvarchar(255),
@newsid bigint,
@blocktype int,
@operator nvarchar(255),
@creator nvarchar(255),
@jockey nvarchar(255),
@blocktime bigint,
@blocktext text,
@sort int
AS


declare @operatorid int
declare @creatorid int
declare @jockeyid int

select @operatorid=userid from users where username like @operator
select @creatorid=userid from users where username like @creator
select @jockeyid=userid from users where username like @jockey
if (@operatorid is null)
begin
    SET @operatorid=0
end
if (@creatorid is null)
begin
    SET @creatorid=0
end
if (@jockeyid is null)
begin
    SET @jockeyid=0
end

INSERT INTO ArchBlocks
                      (Id, Name, NewsId, BLockType, CreatorId, OperatorId, JockeyId, BlockTime, BlockText, Sort)
VALUES     (@id,@name,@newsid,@blocktype,@creatorid,@operator,@jockeyid,@blocktime,@blocktext,@sort)


Код

CREATE proc InsetIntoBlocsFromNF2
@id bigint,
@name nvarchar(255),
@newsid bigint,
@blocktype int,
@operator nvarchar(255),
@creator nvarchar(255),
@jockey nvarchar(255),
@blocktime bigint,
@blocktext text,
@sort int
AS


declare @operatorid int
declare @creatorid int
declare @jockeyid int

select @operatorid=userid from users where username like @operator
select @creatorid=userid from users where username like @creator
select @jockeyid=userid from users where username like @jockey
if (@operatorid is null)
begin
    SET @operatorid=0
end
if (@creatorid is null)
begin
    SET @creatorid=0
end
if (@jockeyid is null)
begin
    SET @jockeyid=0
end

INSERT INTO Blocks
                      (Id, Name, NewsId, BLockType, CreatorId, OperatorId, JockeyId, BlockTime, BlockText, Sort)
VALUES     (@id,@name,@newsid,@blocktype,@creatorid,@operator,@jockeyid,@blocktime,@blocktext,@sort)

 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)