Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Удаление таблицы с первичным ключом? / 25 сообщений из 38, страница 1 из 2
09.11.2020, 12:56
    #40016480
teCa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление таблицы с первичным ключом?
Всем привет. Подскажите, была большая таблица с индексами, я создал копию таблицы и перенес в неё данные. Теперь я хочу удалить старую таблицу, но получаю вот такую ошибку:

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



Подскажите, как в правильном порядке удалить этот ключ и удалить таблицу?
...
Рейтинг: 0 / 0
09.11.2020, 13:12
    #40016484
DeColo®es
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление таблицы с первичным ключом?
teCa,
1. Найти все таблицы, которые ссылаются на удаляемую, удалить там соответствующие FOREIGN KEY
2. Удалить таблицу
...
Рейтинг: 0 / 0
09.11.2020, 13:38
    #40016491
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление таблицы с первичным ключом?
DeColo®es
teCa,
1. Найти все таблицы, которые ссылаются на удаляемую, удалить там соответствующие FOREIGN KEY
2. Удалить таблицу


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

Судя по всему, тредстартер не лыка не вяжет в том "что там у него за связи между таблицами".
Щас он фсе удалит, а потом прискачет с вопросом "а чего у меня ничего не работает"?
...
Рейтинг: 0 / 0
09.11.2020, 13:46
    #40016495
teCa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление таблицы с первичным ключом?
aleks222,

Именно, понятно, что сначала хотелось бы выяснить, что это за связь и как правильно с ней поступить.
...
Рейтинг: 0 / 0
09.11.2020, 14:32
    #40016511
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление таблицы с первичным ключом?
aleks222
Плохой совет.

И, наверняка, ведь, кроме удаления старых FK надо будет создать такие же новые, на копию таблицы.
...
Рейтинг: 0 / 0
09.11.2020, 14:38
    #40016515
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление таблицы с первичным ключом?
Надо сначала выполнить такой запрос:

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

После этого спокойно уже удаляешь таблицу, как обычно.
...
Рейтинг: 0 / 0
09.11.2020, 14:41
    #40016516
teCa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление таблицы с первичным ключом?
fkthat
Надо сначала выполнить такой запрос:

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


Смешно
...
Рейтинг: 0 / 0
09.11.2020, 15:41
    #40016541
DeColo®es
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление таблицы с первичным ключом?
teCa
aleks222,

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

https://ru.wikipedia.org/wiki/Внешний_ключ
...
Рейтинг: 0 / 0
09.11.2020, 15:41
    #40016542
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление таблицы с первичным ключом?
teCa,

информацию о ключах можно получить из представления sys.foreign_key_columns.
...
Рейтинг: 0 / 0
09.11.2020, 15:54
    #40016550
teCa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление таблицы с первичным ключом?
Владислав Колосов,

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

Используя select * from sys.foreign_key_columns, я получаю список из нескольких записей, вижу, что в списке указаны ИД, как я понимаю, сейчас мне нужно понять, какой ключ из данного списка нужен мне?
...
Рейтинг: 0 / 0
09.11.2020, 16:21
    #40016561
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление таблицы с первичным ключом?
...
Рейтинг: 0 / 0
09.11.2020, 16:31
    #40016571
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление таблицы с первичным ключом?
teCa
Смешно

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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


Только это еще не создаст тебе ключи на копии таблицы (как я выше писал), а, скорее всего, это делать надо будет.
...
Рейтинг: 0 / 0
09.11.2020, 17:02
    #40016584
teCa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление таблицы с первичным ключом?
fkthat,

Да, изначально нужно перевести ключи на новую таблицу.
...
Рейтинг: 0 / 0
09.11.2020, 17:26
    #40016590
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление таблицы с первичным ключом?
teCa
Да, изначально нужно перевести ключи на новую таблицу.
Самый простой способ для начинающих:

1. Разрешить в опциях SSMS пересоздавать таблицы из дизайнера.
2. Открыть в дизайнере старую таблицу и добавить какой-нибудь столбец. Переместить вновь добавленный столбец с последней позиции в любое другое место.
3. Получить скрипт изменений.
4. В данном скрипте удалить из тела транзакции все, кроме инструкцийй alter table ... drop constraint ... и alter table ... add constraint ...
5. Профит.
...
Рейтинг: 0 / 0
09.11.2020, 18:07
    #40016605
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление таблицы с первичным ключом?
invm
teCa
Да, изначально нужно перевести ключи на новую таблицу.
Самый простой способ для начинающих:

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

Можно проще - скриптануть все нужные FK и в скрипте поменять имя reference-таблицы.
...
Рейтинг: 0 / 0
09.11.2020, 20:00
    #40016623
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление таблицы с первичным ключом?
fkthat
Можно проще - скриптануть все нужные FK
Поделитесь знаниями - что нужно сказать штатному скриптеру, что бы такое провернуть?
...
Рейтинг: 0 / 0
09.11.2020, 20:05
    #40016628
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление таблицы с первичным ключом?
invm
fkthat
Можно проще - скриптануть все нужные FK
Поделитесь знаниями - что нужно сказать штатному скриптеру, что бы такое провернуть?

...
Рейтинг: 0 / 0
09.11.2020, 20:30
    #40016632
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление таблицы с первичным ключом?
fkthat,

Т.е. предлагаете скриптовать каждую дочернюю таблицу? И чем же это проще?
...
Рейтинг: 0 / 0
09.11.2020, 20:33
    #40016633
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление таблицы с первичным ключом?
fkthat
invm
Поделитесь знаниями - что нужно сказать штатному скриптеру, что бы такое провернуть?

А если таблиц много, то можно скрипт на базе сделать, а потом скопировать ту часть, где FK.
...
Рейтинг: 0 / 0
09.11.2020, 21:01
    #40016639
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление таблицы с первичным ключом?
я бы предложил воспользоваться Smo.
...
Рейтинг: 0 / 0
09.11.2020, 22:19
    #40016653
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление таблицы с первичным ключом?
invm
Т.е. предлагаете скриптовать каждую дочернюю таблицу? И чем же это проще?

А, я понял о чем ты, просто изначально в твой хак не въехал. Да, если доч. таблиц много, то твоим способом быстрее.
...
Рейтинг: 0 / 0
10.11.2020, 11:20
    #40016755
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление таблицы с первичным ключом?
fkthat
invm
Т.е. предлагаете скриптовать каждую дочернюю таблицу? И чем же это проще?

А, я понял о чем ты, просто изначально в твой хак не въехал. Да, если доч. таблиц много, то твоим способом быстрее.
Не понимаю смысла "хака", по моему, скриптануть все таблицы проще, меньше кликов.
...
Рейтинг: 0 / 0
10.11.2020, 11:30
    #40016759
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление таблицы с первичным ключом?
alexeyvg
Не понимаю смысла "хака"
Смысл в том, что студия сама сгенерирует удаление/создание FK для дочерних таблиц. К тому же, еще и не обязательно знать перечень этих таблиц.
...
Рейтинг: 0 / 0
10.11.2020, 12:20
    #40016773
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление таблицы с первичным ключом?
alexeyvg
fkthat
пропущено...

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

Смысл в том, чтобы не скриптовать все дочерние таблицы/ключи по очереди, а скриптануть все это одним махом, вызвав изменения в таблице родительской.
...
Рейтинг: 0 / 0
10.11.2020, 18:16
    #40016923
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление таблицы с первичным ключом?
А, речь о дочерних таблицах, да, это я упустил...
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Удаление таблицы с первичным ключом? / 25 сообщений из 38, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]