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

Откуда: Moscow
Сообщений: 1590
felix_ff
я бы предложил воспользоваться Smo.


[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.

Сообщение было отредактировано: 10 ноя 20, 18:48
10 ноя 20, 18:52    [22229757]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
teCa
Member

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

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


В данном примере, "получить скрипт изменений" возможно без перестроения таблицы? А то у меня в старой таблице все еще 1.8млрда записей.
11 ноя 20, 10:42    [22229983]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
invm
Member

Откуда: Москва
Сообщений: 9489
teCa
В данном примере, "получить скрипт изменений" возможно без перестроения таблицы? А то у меня в старой таблице все еще 1.8млрда записей.
Я разве писал, что таблицу нужно реально перестраивать?
11 ноя 20, 10:46    [22229985]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
teCa
Member

Откуда:
Сообщений: 684
invm,
Просто тестирую на созданной таблице в студии, я добавляю столбец, меняю его место, нажимаю закрыть окно дизайнера. Сначала получаю диалог - "Сохранить внесенные изменения", нажимаю "Да", получаю диалог с скриптом и предложением его сохранить, после закрытия этого диалога, проверяю таблицу, столбец передвинулся.
11 ноя 20, 10:52    [22229987]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
teCa
Member

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

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


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

ALTER TABLE [dbo].[BlogMetrics]  WITH CHECK ADD  CONSTRAINT [FK_BlogMetricsNew_Authors1] FOREIGN KEY([BlogId])
REFERENCES [b][dbo].[Blogs][/b] ([Id])
GO

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


Я правильно всё понял?
11 ноя 20, 11:30    [22230014]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
invm
Member

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

Не надо сохранять изменения. Нужно прямо в дизайнере получить скрипт изменений, нажав соответствующую кнопку на тулбаре.
11 ноя 20, 11:32    [22230016]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
teCa
Member

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

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


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

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, в моём контексте не нужны, так ведь?
11 ноя 20, 11:58    [22230031]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
teCa
Member

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

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
11 ноя 20, 12:07    [22230036]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
invm
Member

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

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

Затем
ALTER TABLE dbo.BlogMetrics ADD CONSTRAINT
	FK_BlogMetricsNew_Authors1 FOREIGN KEY
	(
	BlogId
	) REFERENCES НоваяТаблица
	(
	Id
	) ON UPDATE  NO ACTION 
	 ON DELETE  NO ACTION
11 ноя 20, 12:31    [22230051]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
Диклевич Александр
Member

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

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


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


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

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

Сработает, если в той же схеме.

Сообщение было отредактировано: 11 ноя 20, 12:39
11 ноя 20, 12:42    [22230057]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
teCa
Member

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

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

Затем
ALTER TABLE dbo.BlogMetrics ADD CONSTRAINT
	FK_BlogMetricsNew_Authors1 FOREIGN KEY
	(
	BlogId
	) REFERENCES НоваяТаблица
	(
	Id
	) ON UPDATE  NO ACTION 
	 ON DELETE  NO ACTION


Блокировок таблиц не предусматривает данные действия?
11 ноя 20, 12:56    [22230072]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
teCa
Member

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

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

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


В данной таблице я вижу всего одну строку. Могу ли я через дизайнер просто сменить тип на bigint после удаления внешнего влюча?
11 ноя 20, 13:40    [22230106]     Ответить | Цитировать Сообщить модератору
 Re: Удаление таблицы с первичным ключом?  [new]
teCa
Member

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

Пересоздал ключ.
11 ноя 20, 13:44    [22230110]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Microsoft SQL Server Ответить