Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Удаление таблицы с первичным ключом?  [new]
teCa
Member

Откуда:
Сообщений: 684
Всем привет. Подскажите, была большая таблица с индексами, я создал копию таблицы и перенес в неё данные. Теперь я хочу удалить старую таблицу, но получаю вот такую ошибку:

Could not drop object 'dbo.Authors_old' because it is referenced by a FOREIGN KEY constraint. (Microsoft SQL Server, Error: 3726)


Подскажите, как в правильном порядке удалить этот ключ и удалить таблицу?
9 ноя 20, 12:56    [22228684]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
teCa,
1. Найти все таблицы, которые ссылаются на удаляемую, удалить там соответствующие FOREIGN KEY
2. Удалить таблицу
9 ноя 20, 13:12    [22228700]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
aleks222
Member

Откуда:
Сообщений: 1086
DeColo®es
teCa,
1. Найти все таблицы, которые ссылаются на удаляемую, удалить там соответствующие FOREIGN KEY
2. Удалить таблицу


Плохой совет.

Судя по всему, тредстартер не лыка не вяжет в том "что там у него за связи между таблицами".
Щас он фсе удалит, а потом прискачет с вопросом "а чего у меня ничего не работает"?
9 ноя 20, 13:38    [22228726]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
teCa
Member

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

Именно, понятно, что сначала хотелось бы выяснить, что это за связь и как правильно с ней поступить.
9 ноя 20, 13:46    [22228732]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
fkthat
Member

Откуда:
Сообщений: 3840
aleks222
Плохой совет.

И, наверняка, ведь, кроме удаления старых FK надо будет создать такие же новые, на копию таблицы.
9 ноя 20, 14:32    [22228767]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
fkthat
Member

Откуда:
Сообщений: 3840
Надо сначала выполнить такой запрос:

Модератор: Не смешно


После этого спокойно уже удаляешь таблицу, как обычно.

Сообщение было отредактировано: 9 ноя 20, 14:46
9 ноя 20, 14:38    [22228774]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
teCa
Member

Откуда:
Сообщений: 684
fkthat
Надо сначала выполнить такой запрос:

После этого спокойно уже удаляешь таблицу, как обычно.


Смешно

Сообщение было отредактировано: 9 ноя 20, 14:46
9 ноя 20, 14:41    [22228777]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
teCa
aleks222,

Именно, понятно, что сначала хотелось бы выяснить, что это за связь и как правильно с ней поступить.

https://ru.wikipedia.org/wiki/Внешний_ключ
9 ноя 20, 15:41    [22228825]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
Владислав Колосов
Member

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

информацию о ключах можно получить из представления sys.foreign_key_columns.
9 ноя 20, 15:41    [22228826]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
teCa
Member

Откуда:
Сообщений: 684
Владислав Колосов,

Можно всё же побольше информации?

Используя select * from sys.foreign_key_columns, я получаю список из нескольких записей, вижу, что в списке указаны ИД, как я понимаю, сейчас мне нужно понять, какой ключ из данного списка нужен мне?
9 ноя 20, 15:54    [22228837]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1590
teCa,

https://google.gik-team.com/?q=sys.foreign_key_columns
9 ноя 20, 16:21    [22228850]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
fkthat
Member

Откуда:
Сообщений: 3840
teCa
Смешно

Обхохочешься

DECLARE @table_to_drop sysname = 'Customers'

DECLARE cur_fk CURSOR FOR
  SELECT [name] fk_name, object_name(parent_object_id) tbl_name
  FROM sys.foreign_keys
  WHERE referenced_object_id = object_id(@table_to_drop)

DECLARE @fk_name sysname,
  @tbl_name sysname,
  @sql nvarchar(512)

OPEN cur_fk
FETCH NEXT FROM cur_fk INTO @fk_name, @tbl_name
WHILE @@FETCH_STATUS = 0 BEGIN
  SET @sql = 'alter table ' + @tbl_name + ' drop constraint ' + @fk_name
  EXEC sp_executesql @sql
  FETCH NEXT FROM cur_fk INTO @fk_name, @tbl_name
END
CLOSE cur_fk
DEALLOCATE cur_fk

Только это еще не создаст тебе ключи на копии таблицы (как я выше писал), а, скорее всего, это делать надо будет.
9 ноя 20, 16:31    [22228863]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
teCa
Member

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

Да, изначально нужно перевести ключи на новую таблицу.
9 ноя 20, 17:02    [22228895]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
invm
Member

Откуда: Москва
Сообщений: 9489
teCa
Да, изначально нужно перевести ключи на новую таблицу.
Самый простой способ для начинающих:

1. Разрешить в опциях SSMS пересоздавать таблицы из дизайнера.
2. Открыть в дизайнере старую таблицу и добавить какой-нибудь столбец. Переместить вновь добавленный столбец с последней позиции в любое другое место.
3. Получить скрипт изменений.
4. В данном скрипте удалить из тела транзакции все, кроме инструкцийй alter table ... drop constraint ... и alter table ... add constraint ...
5. Профит.
9 ноя 20, 17:26    [22228910]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
fkthat
Member

Откуда:
Сообщений: 3840
invm
teCa
Да, изначально нужно перевести ключи на новую таблицу.
Самый простой способ для начинающих:

1. Разрешить в опциях SSMS пересоздавать таблицы из дизайнера.
2. Открыть в дизайнере старую таблицу и добавить какой-нибудь столбец. Переместить вновь добавленный столбец с последней позиции в любое другое место.
3. Получить скрипт изменений.
4. В данном скрипте удалить из тела транзакции все, кроме инструкцийй alter table ... drop constraint ... и alter table ... add constraint ...
5. Профит.

Можно проще - скриптануть все нужные FK и в скрипте поменять имя reference-таблицы.
9 ноя 20, 18:07    [22228943]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
invm
Member

Откуда: Москва
Сообщений: 9489
fkthat
Можно проще - скриптануть все нужные FK
Поделитесь знаниями - что нужно сказать штатному скриптеру, что бы такое провернуть?
9 ноя 20, 20:00    [22229049]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
fkthat
Member

Откуда:
Сообщений: 3840
invm
fkthat
Можно проще - скриптануть все нужные FK
Поделитесь знаниями - что нужно сказать штатному скриптеру, что бы такое провернуть?

Картинка с другого сайта.
9 ноя 20, 20:05    [22229061]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
invm
Member

Откуда: Москва
Сообщений: 9489
fkthat,

Т.е. предлагаете скриптовать каждую дочернюю таблицу? И чем же это проще?
9 ноя 20, 20:30    [22229079]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31602
fkthat
invm
Поделитесь знаниями - что нужно сказать штатному скриптеру, что бы такое провернуть?

Картинка с другого сайта.
А если таблиц много, то можно скрипт на базе сделать, а потом скопировать ту часть, где FK.

Сообщение было отредактировано: 9 ноя 20, 20:29
9 ноя 20, 20:33    [22229085]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1590
я бы предложил воспользоваться Smo.
9 ноя 20, 21:01    [22229099]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
fkthat
Member

Откуда:
Сообщений: 3840
invm
Т.е. предлагаете скриптовать каждую дочернюю таблицу? И чем же это проще?

А, я понял о чем ты, просто изначально в твой хак не въехал. Да, если доч. таблиц много, то твоим способом быстрее.
9 ноя 20, 22:19    [22229131]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31602
fkthat
invm
Т.е. предлагаете скриптовать каждую дочернюю таблицу? И чем же это проще?

А, я понял о чем ты, просто изначально в твой хак не въехал. Да, если доч. таблиц много, то твоим способом быстрее.
Не понимаю смысла "хака", по моему, скриптануть все таблицы проще, меньше кликов.
10 ноя 20, 11:20    [22229393]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
invm
Member

Откуда: Москва
Сообщений: 9489
alexeyvg
Не понимаю смысла "хака"
Смысл в том, что студия сама сгенерирует удаление/создание FK для дочерних таблиц. К тому же, еще и не обязательно знать перечень этих таблиц.
10 ноя 20, 11:30    [22229401]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
fkthat
Member

Откуда:
Сообщений: 3840
alexeyvg
fkthat
пропущено...

А, я понял о чем ты, просто изначально в твой хак не въехал. Да, если доч. таблиц много, то твоим способом быстрее.
Не понимаю смысла "хака", по моему, скриптануть все таблицы проще, меньше кликов.

Смысл в том, чтобы не скриптовать все дочерние таблицы/ключи по очереди, а скриптануть все это одним махом, вызвав изменения в таблице родительской.
10 ноя 20, 12:20    [22229439]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31602
А, речь о дочерних таблицах, да, это я упустил...
10 ноя 20, 18:16    [22229742]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить