Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Exchange partition  [new]
Gollum
Member

Откуда: Мглистые горы
Сообщений: 207
Таблица фактов с партиционированием:

CREATE PARTITION FUNCTION MyIntDatePartFunc (int) AS RANGE RIGHT FOR VALUES ('20140101', '20140201', ... , '20251201', '20260101');


Поле партиционирования KEY_DATE_START, int, непустое

- Создаю таблицу (create as select ) - TMP_F_table
- И вторую, чтобы таджикская СУБД поверила, что партиция пустая, на которую потом переключу заполненную партицию - TMPP_F_table

- заполняю таблицу TMP_F_table

- проверяю
select max($PARTITION.MyIntDatePartFunc(KEY_DATE_START)), min($PARTITION.MyIntDatePartFunc(KEY_DATE_START)), min(key_date_start), max(key_date_start) from TMP_F_table

Одна партиция, значения 20180101 20180131

- переключаю на пустую существующую партицию (TMPP_F_table)

- проверяю результат - Одна партиция, значения 20180101 20180131

- создаю констрейнт WITH CHECK на таблице TMP_F_table

- переключаю на партиционированную:

MSSQL 4982 ALTER TABLE SWITCH allows values that are not allowed by check constraints or partition function

Индексы поубивал, диапазоны констрейнту как только не задавал, начал с
([KEY_DATE_START]>=(20180101) AND [KEY_DATE_START]<(20180132))
3 фев 18, 17:34    [21163077]     Ответить | Цитировать Сообщить модератору
 Re: Exchange partition  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33229
Блог
Gollum,

давайте реальный пример на 5 строчках данных
3 фев 18, 20:57    [21163371]     Ответить | Цитировать Сообщить модератору
 Re: Exchange partition  [new]
nvv
Member

Откуда:
Сообщений: 54
Gollum, [KEY_DATE_START]<(20180132) ?? 32 января? Integer?

Не понятен описанных порядок ваших действий. Сначала перенесли данные в пустую секцию, а только потом создаете ограничение?
автор
- создаю констрейнт WITH CHECK на таблице TMP_F_table

Какой-то бред.
3 фев 18, 21:26    [21163395]     Ответить | Цитировать Сообщить модератору
 Re: Exchange partition  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30701
Gollum
- создаю констрейнт WITH CHECK на таблице TMP_F_table

- переключаю на партиционированную:

MSSQL 4982 ALTER TABLE SWITCH allows values that are not allowed by check constraints or partition function

Индексы поубивал, диапазоны констрейнту как только не задавал, начал с
([KEY_DATE_START]>=(20180101) AND [KEY_DATE_START]<(20180132))
Надо, что бы констрейн точно соответствовал условиям функции.
У вас же в функции нету 20180132, наверное, следующее значение 20180201?
Значит, надо ([KEY_DATE_START]>=(20180101) AND [KEY_DATE_START]<(20180201))

Ещё, в функции у вас границы задаются как строки (почему, интересно, для типа int???)
Тогда нужно и в чек-кронстрейне задавать как строки, как я понимаю.
Очень оно чувствительно.
3 фев 18, 22:19    [21163476]     Ответить | Цитировать Сообщить модератору
 Re: Exchange partition  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30701
nvv
автор
- создаю констрейнт WITH CHECK на таблице TMP_F_table

Какой-то бред.
Ээээ, разве можно по другому? Как именно, подскажите?
3 фев 18, 22:19    [21163477]     Ответить | Цитировать Сообщить модератору
 Re: Exchange partition  [new]
Gollum
Member

Откуда: Мглистые горы
Сообщений: 207
alexeyvg
Надо, что бы констрейн точно соответствовал условиям функции.
У вас же в функции нету 20180132, наверное, следующее значение 20180201?


Вот на песочнице было все равно, лишь бы влезало в границы. А на боевой - почему-то отказывается
5 фев 18, 11:46    [21166260]     Ответить | Цитировать Сообщить модератору
 Re: Exchange partition  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
по полю какого типа секционирование?
сперва кажется, что по дате, и что даты заданы стринговыми литералами.
зетем констрэйнт вдруд по int-ам, которые, если перевести на даты, вообще другие границы задают.
или поле вообще char?
5 фев 18, 11:59    [21166346]     Ответить | Цитировать Сообщить модератору
 Re: Exchange partition  [new]
uaggster
Member

Откуда:
Сообщений: 757
Gollum
...

MSSQL 4982 ALTER TABLE SWITCH allows values that are not allowed by check constraints or partition function
...

У вас все констрейнты (даже если их нет :-) ) - стали недоверенными.
Сделайте на таблице, которую вы собираетесь переключить в партицию:

ALTER TABLE TMP_F_table WITH CHECK CHECK CONSTRAINT all
5 фев 18, 12:08    [21166388]     Ответить | Цитировать Сообщить модератору
 Re: Exchange partition  [new]
Gollum
Member

Откуда: Мглистые горы
Сообщений: 207
uaggster
ALTER TABLE TMP_F_table WITH CHECK CHECK CONSTRAINT all


Нет, не помогло
7 фев 18, 11:49    [21172558]     Ответить | Цитировать Сообщить модератору
 Re: Exchange partition  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
про тип колонки ответьте,
а то секционирование точно не по инту,
а зато check constraint как раз по нему
7 фев 18, 12:21    [21172701]     Ответить | Цитировать Сообщить модератору
 Re: Exchange partition  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
причина всему -- ваш бардак с типами.
функция секционирования уже криво определена:
зачем писать строки, если вы секционируете целые числа?
но сервер молча проглотил, а вы, видимо, решили, что какая вообще разница, числа или строки.

ну а теперь репро (хотя и не совсем той ошибки):
создаю 2 таблицы на схеме, созданной из вашей кривой функции,
заполняю таблицу TMP_F_table вашими int-значениями, успешно ее переключаю в основную.
затем обратно переключаю, чтобы далее продолжить эксперимент.

CREATE PARTITION FUNCTION MyIntDatePartFunc (int) 
AS RANGE RIGHT FOR VALUES ('20180101', '20180201', '20180301', '20180401');
GO

create partition scheme MyIntDatePartSch
as partition MyIntDatePartFunc to
([primary],[primary],[primary],[primary],[primary]);

create table dbo.test(KEY_DATE_START int not null) on MyIntDatePartSch(KEY_DATE_START);

create table TMP_F_table(KEY_DATE_START int not null) on MyIntDatePartSch(KEY_DATE_START);
insert into TMP_F_table values (20180101), (20180131);

select $Partition.MyIntDatePartFunc (20180101);
---
--2

alter table TMP_F_table switch partition 2 to dbo.test partition 2;
-- Command(s) completed successfully.

alter table dbo.test switch partition 2 to TMP_F_table partition 2;
-- Command(s) completed successfully.

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

alter table TMP_F_table add constraint CK_int
check ([KEY_DATE_START]>=(20180101) AND [KEY_DATE_START]<(20180132));

alter table TMP_F_table switch partition 2 to dbo.test partition 2;
-- Command(s) completed successfully.


зато теперь делаем переключение обратно и обламываемся:

alter table dbo.test switch partition 2 to TMP_F_table partition 2;


Msg 4972, Level 16, State 1, Line 30
ALTER TABLE SWITCH statement failed. Check constraints or partition function of source table 'partitioning.dbo.test' allows values that are not allowed by check constraints or partition function on target table 'partitioning.dbo.TMP_F_table'.


ну что, обратно не переключает, ибо даже при равных схемах,
условие констрэйнта может быть нарушено,
т.е. оно не эквивалентно схеме секционирования.

и даже понятно, почему.
20180199 удовлетворяет вашей дурацкой строковой функции:
declare @int int = 20180199
select case when @int between '20180101' and '20180201' then 'yes' else 'no' end
---
yes


но НЕ удовлетворяет констрэйнту.
и поэтому никого уже не интересует одинаковость схем.
------------
теперь 2 вопроса:
1) зачем в функции использованы строки, если вы секционируете по числам?
2) зачем констрэйнт, если ваша темповая таблица и без того на той же схеме?
7 фев 18, 16:31    [21173803]     Ответить | Цитировать Сообщить модератору
 Re: Exchange partition  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
alexeyvg
У вас же в функции нету 20180132, наверное, следующее значение 20180201?
Значит, надо ([KEY_DATE_START]>=(20180101) AND [KEY_DATE_START]<(20180201))

Ещё, в функции у вас границы задаются как строки (почему, интересно, для типа int???)
Тогда нужно и в чек-кронстрейне задавать как строки, как я понимаю.
Очень оно чувствительно.

вообще катит и с целыми в констрэйнте,
но диапазон, разумеется, надо брать ваш, а не ТС.
ну и да, зачем же задавать числа строками?
мне тоже совершенно непонятно
7 фев 18, 16:43    [21173851]     Ответить | Цитировать Сообщить модератору
 Re: Exchange partition  [new]
Gollum
Member

Откуда: Мглистые горы
Сообщений: 207
Yasha123
про тип колонки ответьте,
а то секционирование точно не по инту



автор
Поле партиционирования KEY_DATE_START, int, непустое



Yasha123
а зато check constraint как раз по нему


И функция по нему, и прекрасно работает. И exchange partition прекрасно работает с точно такой же по структуре таблице
15 фев 18, 04:18    [21192645]     Ответить | Цитировать Сообщить модератору
 Re: Exchange partition  [new]
Gollum
Member

Откуда: Мглистые горы
Сообщений: 207
Yasha123
если ваша темповая таблица и без того секционирована


Именно потому, что она не партиционирована, и создается констрейнт. Но Вам, похоже, все равно, Вы пишете, а не читаете...
15 фев 18, 04:29    [21192651]     Ответить | Цитировать Сообщить модератору
 Re: Exchange partition  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
Gollum
Yasha123
если ваша темповая таблица и без того секционирована


Именно потому, что она не партиционирована, и создается констрейнт. Но Вам, похоже, все равно, Вы пишете, а не читаете...

это вы не читаете.
констрэйнт по диапазону int не эквивалентен диапазонам секциониррвания по строкам
15 фев 18, 08:18    [21192732]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить