Задача для чайников
В справочнике Страны оказалось две России.
Удалить лишнюю нельзя т.к. в справочнике Регионы используется одна, а в других справочниках другая.
Необходимо во всех элементах справочника Регионы программно заменить одну Россию на другую.
Заранее спасибо
Нравится
Здравствуйте!
Я бы сказал, что задача вовсе не для "чайников", а скорее для гуру по базам данных...
Какая у Вас СУБД?
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% используя информацию о внешних ключах. "Почти" - так как есть вероятность что есть таблицы у которых нет внешних ключей на таблицу "Страны", но хранятся ссылки на ее записи.