Разделение таблицы, на которую ссылается внешний ключ - PullRequest
0 голосов
/ 27 февраля 2020

Около 20 таблиц разделены на месячной основе. Все они имеют столбец даты, как ключ раздела. Пока все хорошо, но на многие секционированные таблицы ссылается один или несколько внешних ключей. Это мешает мне сделать раздел «Отключение + удаление». Поскольку SQL Сервер выдает ошибку:

Msg 50000, Уровень 16, Состояние 1, Процедура HandleError, Строка 26 [Batch Start Line 0]

На таблицу нельзя ссылаться по ограничению внешнего ключа.

Существует возможность удалить ограничения перед выключением и воссоздать их после выключения, как вы можете видеть на скриншоте, есть много FK. Другой вариант - выполнить оператор delete для каждой таблицы, на которую влияют, перед удалением самого старого раздела. Но это займет время, потому что мы говорим о миллионах записей / разделах.

В Oracle это, похоже, не проблема. Как только Oracle увидит, что больше нет ссылок с FK на PK, раздел может быть удален. В SQL сервера нет. Я попробовал это, просто чтобы быть уверенным.

У кого-нибудь есть лучшая идея, как решить эту проблему изящным способом?

Picture with all partitioned tables with their reference constraints

1 Ответ

0 голосов
/ 22 апреля 2020

Вы можете просто изменить свои FK, чтобы не проверять существующие данные с помощью команды nockeck constraint. Тогда переключатель разделов будет работать. Пожалуйста, смотрите пример ниже.

CREATE PARTITION FUNCTION part_fun_test(int)
AS RANGE RIGHT FOR VALUES(10, 20, 30)
GO
CREATE PARTITION SCHEME part_schem AS PARTITION part_fun_test
ALL TO ([primary])
GO
CREATE TABLE Main_t(
id INT IDENTITY PRIMARY KEY CLUSTERED,
name VARCHAR(50)
) ON part_schem(id)
GO

CREATE TABLE Main_t_ref(
ID INT IDENTITY, 
MainID INT CONSTRAINT FK_t FOREIGN KEY REFERENCES dbo.Main_t(id)
)
GO 
CREATE TABLE Second_t(
id INT IDENTITY PRIMARY KEY CLUSTERED,
name VARCHAR(50)
)

INSERT INTO dbo.Main_t
        ( name )
DEFAULT VALUES
GO 30 

ALTER TABLE dbo.Main_t SWITCH PARTITION 1 TO dbo.Second_t --error
GO
ALTER TABLE dbo.Main_t_ref NOCHECK CONSTRAINT FK_t
GO
ALTER TABLE dbo.Main_t SWITCH PARTITION 1 TO dbo.Second_t --no error
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...