Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
Критик Member Откуда: Москва / Калуга Сообщений: 34748 Блог |
Gollum, давайте реальный пример на 5 строчках данных |
3 фев 18, 20:57 [21163371] Ответить | Цитировать Сообщить модератору |
nvv Member Откуда: Сообщений: 54 |
Gollum, [KEY_DATE_START]<(20180132) ?? 32 января? Integer? Не понятен описанных порядок ваших действий. Сначала перенесли данные в пустую секцию, а только потом создаете ограничение?
Какой-то бред. |
||
3 фев 18, 21:26 [21163395] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
У вас же в функции нету 20180132, наверное, следующее значение 20180201? Значит, надо ([KEY_DATE_START]>=(20180101) AND [KEY_DATE_START]<(20180201)) Ещё, в функции у вас границы задаются как строки (почему, интересно, для типа int???) Тогда нужно и в чек-кронстрейне задавать как строки, как я понимаю. Очень оно чувствительно. |
||
3 фев 18, 22:19 [21163476] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
|
||||
3 фев 18, 22:19 [21163477] Ответить | Цитировать Сообщить модератору |
Gollum Member Откуда: Мглистые горы Сообщений: 207 |
Вот на песочнице было все равно, лишь бы влезало в границы. А на боевой - почему-то отказывается |
||
5 фев 18, 11:46 [21166260] Ответить | Цитировать Сообщить модератору |
Yasha123 Member Откуда: Сообщений: 1955 |
по полю какого типа секционирование? сперва кажется, что по дате, и что даты заданы стринговыми литералами. зетем констрэйнт вдруд по int-ам, которые, если перевести на даты, вообще другие границы задают. или поле вообще char? |
5 фев 18, 11:59 [21166346] Ответить | Цитировать Сообщить модератору |
uaggster Member Откуда: Сообщений: 954 |
У вас все констрейнты (даже если их нет :-) ) - стали недоверенными. Сделайте на таблице, которую вы собираетесь переключить в партицию: ALTER TABLE TMP_F_table WITH CHECK CHECK CONSTRAINT all |
||
5 фев 18, 12:08 [21166388] Ответить | Цитировать Сообщить модератору |
Gollum Member Откуда: Мглистые горы Сообщений: 207 |
Нет, не помогло |
||
7 фев 18, 11:49 [21172558] Ответить | Цитировать Сообщить модератору |
Yasha123 Member Откуда: Сообщений: 1955 |
про тип колонки ответьте, а то секционирование точно не по инту, а зато check constraint как раз по нему |
7 фев 18, 12:21 [21172701] Ответить | Цитировать Сообщить модератору |
Yasha123 Member Откуда: Сообщений: 1955 |
причина всему -- ваш бардак с типами. функция секционирования уже криво определена: зачем писать строки, если вы секционируете целые числа? но сервер молча проглотил, а вы, видимо, решили, что какая вообще разница, числа или строки. ну а теперь репро (хотя и не совсем той ошибки): создаю 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] Ответить | Цитировать Сообщить модератору |
Yasha123 Member Откуда: Сообщений: 1955 |
вообще катит и с целыми в констрэйнте, но диапазон, разумеется, надо брать ваш, а не ТС. ну и да, зачем же задавать числа строками? мне тоже совершенно непонятно |
||
7 фев 18, 16:43 [21173851] Ответить | Цитировать Сообщить модератору |
Gollum Member Откуда: Мглистые горы Сообщений: 207 |
И функция по нему, и прекрасно работает. И exchange partition прекрасно работает с точно такой же по структуре таблице |
||||||
15 фев 18, 04:18 [21192645] Ответить | Цитировать Сообщить модератору |
Gollum Member Откуда: Мглистые горы Сообщений: 207 |
Именно потому, что она не партиционирована, и создается констрейнт. Но Вам, похоже, все равно, Вы пишете, а не читаете... |
||
15 фев 18, 04:29 [21192651] Ответить | Цитировать Сообщить модератору |
Yasha123 Member Откуда: Сообщений: 1955 |
это вы не читаете. констрэйнт по диапазону int не эквивалентен диапазонам секциониррвания по строкам |
||||
15 фев 18, 08:18 [21192732] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |