Скрипты
Разработка

Программная замена значений справочника

Задача для чайников
В справочнике Страны оказалось две России.
Удалить лишнюю нельзя т.к. в справочнике Регионы используется одна, а в других справочниках другая.
Необходимо во всех элементах справочника Регионы программно заменить одну Россию на другую.

Заранее спасибо

Нравится

11 комментариев

Здравствуйте!
Я бы сказал, что задача вовсе не для "чайников", а скорее для гуру по базам данных...
Какая у Вас СУБД?

А версия Terrasoft CRM?

1. Вам необходимо выбрать какой ID из таблицы tbl_State Вы хотите оставить. Пусть это будет @NewID, а дубль @OldID
2. По данному результату строите курсор:

if not object_id('tempdb..#fkeysout') is null drop table #fkeysout
GO
create table #fkeysout(
			PKTABLE_QUALIFIER sysname collate database_default NULL,
			PKTABLE_OWNER sysname collate database_default NULL,
			PKTABLE_NAME sysname collate database_default NOT NULL,
			PKCOLUMN_NAME sysname collate database_default NOT NULL,
			FKTABLE_QUALIFIER sysname collate database_default NULL,
			FKTABLE_OWNER sysname collate database_default NULL,
			FKTABLE_NAME sysname collate database_default NOT NULL,
			FKCOLUMN_NAME sysname collate database_default NOT NULL,
			KEY_SEQ smallint NOT NULL,
			UPDATE_RULE smallint NULL,
			DELETE_RULE smallint NULL,
			FK_NAME sysname collate database_default NULL,
			PK_NAME sysname collate database_default NULL,
			DEFERRABILITY smallint null)
GO
insert into #fkeysout
exec sp_fkeys @pktable_name = 'tbl_State'
GO
select * from #fkeysout
GO

3. Далее в цикле по курсору получаете @FKTABLE_NAME и выполняете запрос вида:

exec('update [' + @FKTABLE_NAME + '] set [StateID] = ''' + @NewID+ ''' where [StateID] = ''' + @OldID + '''')

4. Удаляете дубль:

delete from [tbl_State]
where [ID] = @OldID

5. Проверьте все что Вы напишете обязательно на копии базы данных, и когда будете уверенны в правильности - выполняйте на "боевой" базе данных

а разве не прокатит что-то вроде тaкого?:

UPDATE tbl_Region SET StateID = :NewID
WHERE StateID = :OldID
 
DELETE from tbl_State
WHERE ID = :OldID

или я неправильно понял задачу...

Извините, что ввел в заблуждение, в предыдущем скрипте ошибка:( tbl_State необходимо на заменить на tbl_Country и поле StateID заменить на CountryID
Вы все правильно поняли, но Вы написали 1 запрос по обновлению Регионов, а таблица "Страны" участвует во многих местах. В базовой поставке 5 таких мест. У Вас их может быть больше, если делали доработки.
п. 3
должен выглядеть так:

3. Далее в цикле по курсору получаете @FKTABLE_NAME и @FKCOLUMN_NAME и выполняете запрос вида:

exec('update [' + @FKTABLE_NAME + '] set [' + @FKCOLUMN_NAME + '] = ''' + @NewID+ ''' where [' + @FKCOLUMN_NAME + '] = ''' + @OldID + '''')

Так а автор, вроде, про Регионы только спрашивал.. мол, "Необходимо во всех элементах справочника Регионы программно заменить одну Россию на другую."
Хотя, ладно, не спорю :)

Заменить получиться, но дубль не получиться удалить, так как внешние ключи из других таблиц не дадут этого сделать.

Так Запевалов Денис говорит нам, что в Регионах используется одна, а во всех других другая и нам надо просто поменять в Регионах. Когда заменим в Регионах то на старую Россию ссылок не будет(т.к., судя по посту, на старую идет развязка только в таблице Регионы) и ее можно будет спокойно удалить.

Гарантировать то что дубль страны "Россия" используется только в Регионах, можно только проверив наличие этого дубля во всех таблицах, где есть ссылки на таблицу "Страны". Это можно гарантировать почти на 100% используя информацию о внешних ключах. "Почти" - так как есть вероятность что есть таблицы у которых нет внешних ключей на таблицу "Страны", но хранятся ссылки на ее записи.

Показать все комментарии