powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Удаление таблицы с первичным ключом?
13 сообщений из 38, страница 2 из 2
Удаление таблицы с первичным ключом?
    #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
13 сообщений из 38, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Удаление таблицы с первичным ключом?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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