powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Удаление таблицы с первичным ключом?
38 сообщений из 38, показаны все 2 страниц
Удаление таблицы с первичным ключом?
    #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
Удаление таблицы с первичным ключом?
    #40016484
Фотография DeColo®es
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa,
1. Найти все таблицы, которые ссылаются на удаляемую, удалить там соответствующие FOREIGN KEY
2. Удалить таблицу
...
Рейтинг: 0 / 0
Удаление таблицы с первичным ключом?
    #40016491
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeColo®es
teCa,
1. Найти все таблицы, которые ссылаются на удаляемую, удалить там соответствующие FOREIGN KEY
2. Удалить таблицу


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

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

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

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

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

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

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


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

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

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

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

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

Используя select * from sys.foreign_key_columns, я получаю список из нескольких записей, вижу, что в списке указаны ИД, как я понимаю, сейчас мне нужно понять, какой ключ из данного списка нужен мне?
...
Рейтинг: 0 / 0
Удаление таблицы с первичным ключом?
    #40016561
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Удаление таблицы с первичным ключом?
    #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
Удаление таблицы с первичным ключом?
    #40016584
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

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

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

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

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

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

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

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

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

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

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

Смысл в том, чтобы не скриптовать все дочерние таблицы/ключи по очереди, а скриптануть все это одним махом, вызвав изменения в таблице родительской.
...
Рейтинг: 0 / 0
Удаление таблицы с первичным ключом?
    #40016923
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, речь о дочерних таблицах, да, это я упустил...
...
Рейтинг: 0 / 0
Удаление таблицы с первичным ключом?
    #40016928
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff
я бы предложил воспользоваться Smo.


Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO")

$target = "myMasterTable"
$newtarget = "myMasterTableNew"
$instance = "(local)";
$server = New-Object("Microsoft.SqlServer.Management.Smo.server")
$db = $server.Databases["myDatabase"]
ForEach ($tbl in $db.Tables) {
  ForEach ($fk in $tbl.ForeignKeys) {
     if ($fk.ReferencedTable = $target) { echo $fk.Script().Replace($target, $newtarget) }
  }
}



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

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


В данном примере, "получить скрипт изменений" возможно без перестроения таблицы? А то у меня в старой таблице все еще 1.8млрда записей.
...
Рейтинг: 0 / 0
Удаление таблицы с первичным ключом?
    #40017052
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa
В данном примере, "получить скрипт изменений" возможно без перестроения таблицы? А то у меня в старой таблице все еще 1.8млрда записей.
Я разве писал, что таблицу нужно реально перестраивать?
...
Рейтинг: 0 / 0
Удаление таблицы с первичным ключом?
    #40017053
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,
Просто тестирую на созданной таблице в студии, я добавляю столбец, меняю его место, нажимаю закрыть окно дизайнера. Сначала получаю диалог - "Сохранить внесенные изменения", нажимаю "Да", получаю диалог с скриптом и предложением его сохранить, после закрытия этого диалога, проверяю таблицу, столбец передвинулся.
...
Рейтинг: 0 / 0
Удаление таблицы с первичным ключом?
    #40017069
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По данной теме, я теперь знаю, что у той таблице, которую я хочу удалить, есть лишь одна связь, я знаю эту талицу и заскриптовал ключ, ссылающийся на старую таблицу:

Код: sql
1.
2.
3.
4.
5.
6.
ALTER TABLE [dbo].[BlogMetrics]  WITH CHECK ADD  CONSTRAINT [FK_BlogMetricsNew_Authors1] FOREIGN KEY([BlogId])
REFERENCES [dbo].[Blogs_old] ([Id])
GO

ALTER TABLE [dbo].[BlogMetrics] CHECK CONSTRAINT [FK_BlogMetricsNew_Authors1]
GO



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

Код: sql
1.
2.
3.
4.
5.
6.
ALTER TABLE [dbo].[BlogMetrics]  WITH CHECK ADD  CONSTRAINT [FK_BlogMetricsNew_Authors1] FOREIGN KEY([BlogId])
REFERENCES [dbo].[Blogs] ([Id])
GO

ALTER TABLE [dbo].[BlogMetrics] CHECK CONSTRAINT [FK_BlogMetricsNew_Authors1]
GO



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

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

Не надо сохранять изменения. Нужно прямо в дизайнере получить скрипт изменений, нажав соответствующую кнопку на тулбаре.


Спасибо, получился вот такой скрипт:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
ALTER TABLE dbo.Blogs_old DROP CONSTRAINT DF_Blogs01_rep
GO
ALTER TABLE dbo.Blogs_old DROP CONSTRAINT DF_Blogs01_isEnabled
GO
ALTER TABLE dbo.Tmp_Blogs_old SET (LOCK_ESCALATION = TABLE)
GO
ALTER TABLE dbo.Tmp_Blogs_old ADD CONSTRAINT
	DF_Blogs01_rep DEFAULT ((1)) FOR rep
GO
ALTER TABLE dbo.Tmp_Blogs_old ADD CONSTRAINT
	DF_Blogs01_isEnabled DEFAULT ((1)) FOR isEnabled
GO
ALTER TABLE dbo.BlogMetrics
	DROP CONSTRAINT FK_BlogMetricsNew_Authors1
GO
ALTER TABLE dbo.Blogs_old ADD CONSTRAINT
	PK_Blogs01 PRIMARY KEY CLUSTERED 
	(
	Id
	) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON SSD_FG

GO
ALTER TABLE dbo.BlogMetrics ADD CONSTRAINT
	FK_BlogMetricsNew_Authors1 FOREIGN KEY
	(
	BlogId
	) REFERENCES dbo.Blogs_old
	(
	Id
	) ON UPDATE  NO ACTION 
	 ON DELETE  NO ACTION 
	
GO
ALTER TABLE dbo.BlogMetrics SET (LOCK_ESCALATION = TABLE)
GO



Подскажите, команды для dbo.Tmp_Blogs_old , в моём контексте не нужны, так ведь?
...
Рейтинг: 0 / 0
Удаление таблицы с первичным ключом?
    #40017086
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa,

Код: sql
1.
2.
3.
4.
5.
6.
7.
ALTER TABLE dbo.Blogs_old ADD CONSTRAINT
	PK_Blogs01 PRIMARY KEY CLUSTERED 
	(
	Id
	) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON SSD_FG

GO



Это тоже вычеркиваем, как я понимаю? На новое таблице уже есть PK_Blogs01_bigint
...
Рейтинг: 0 / 0
Удаление таблицы с первичным ключом?
    #40017095
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa,

Перед удалением старой выполнить
Код: sql
1.
2.
ALTER TABLE dbo.BlogMetrics
	DROP CONSTRAINT FK_BlogMetricsNew_Authors1


Затем
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
ALTER TABLE dbo.BlogMetrics ADD CONSTRAINT
	FK_BlogMetricsNew_Authors1 FOREIGN KEY
	(
	BlogId
	) REFERENCES НоваяТаблица
	(
	Id
	) ON UPDATE  NO ACTION 
	 ON DELETE  NO ACTION
...
Рейтинг: 0 / 0
Удаление таблицы с первичным ключом?
    #40017100
Диклевич Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa
Всем привет. Подскажите, была большая таблица с индексами, я создал копию таблицы и перенес в неё данные. Теперь я хочу удалить старую таблицу, но получаю вот такую ошибку:

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



Подскажите, как в правильном порядке удалить этот ключ и удалить таблицу?


А такая вот задача не решается ли простым переименованием старой таблицы?
Если новая это идентичная копия по структуре и данным, то в чем смысл всех этих манипуляций?

если делать через sp_rename, то и определения внешних ключей сами пофиксятся.

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

Перед удалением старой выполнить
Код: sql
1.
2.
ALTER TABLE dbo.BlogMetrics
	DROP CONSTRAINT FK_BlogMetricsNew_Authors1


Затем
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
ALTER TABLE dbo.BlogMetrics ADD CONSTRAINT
	FK_BlogMetricsNew_Authors1 FOREIGN KEY
	(
	BlogId
	) REFERENCES НоваяТаблица
	(
	Id
	) ON UPDATE  NO ACTION 
	 ON DELETE  NO ACTION



Блокировок таблиц не предусматривает данные действия?
...
Рейтинг: 0 / 0
Удаление таблицы с первичным ключом?
    #40017136
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa,

При создании нового ключа, получаю такую ошибку:

авторСтолбец «dbo.Blogs.Id» не является тем же типом данных, что и столбец «BlogMetrics.BlogId» во внешнем ключе «FK_BlogMetricsNew_Authors1».

В данной таблице я вижу всего одну строку. Могу ли я через дизайнер просто сменить тип на bigint после удаления внешнего влюча?
...
Рейтинг: 0 / 0
Удаление таблицы с первичным ключом?
    #40017140
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa,

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


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