powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Exchange partition
15 сообщений из 15, страница 1 из 1
Exchange partition
    #39596104
Gollum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблица фактов с партиционированием:

Код: sql
1.
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

- проверяю
Код: sql
1.
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

Индексы поубивал, диапазоны констрейнту как только не задавал, начал с
Код: sql
1.
([KEY_DATE_START]>=(20180101) AND [KEY_DATE_START]<(20180132))
...
Рейтинг: 0 / 0
Exchange partition
    #39596187
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gollum,

давайте реальный пример на 5 строчках данных
...
Рейтинг: 0 / 0
Exchange partition
    #39596191
nvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nvv
Гость
Gollum, [KEY_DATE_START]<(20180132) ?? 32 января? Integer?

Не понятен описанных порядок ваших действий. Сначала перенесли данные в пустую секцию, а только потом создаете ограничение?
автор- создаю констрейнт WITH CHECK на таблице TMP_F_table
Какой-то бред.
...
Рейтинг: 0 / 0
Exchange partition
    #39596209
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gollum- создаю констрейнт WITH CHECK на таблице TMP_F_table

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

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

Индексы поубивал, диапазоны констрейнту как только не задавал, начал с
Код: sql
1.
([KEY_DATE_START]>=(20180101) AND [KEY_DATE_START]<(20180132))

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

Ещё, в функции у вас границы задаются как строки (почему, интересно, для типа int???)
Тогда нужно и в чек-кронстрейне задавать как строки, как я понимаю.
Очень оно чувствительно.
...
Рейтинг: 0 / 0
Exchange partition
    #39596210
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nvvавтор- создаю констрейнт WITH CHECK на таблице TMP_F_table
Какой-то бред.Ээээ, разве можно по другому? Как именно, подскажите?
...
Рейтинг: 0 / 0
Exchange partition
    #39596638
Gollum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgНадо, что бы констрейн точно соответствовал условиям функции.
У вас же в функции нету 20180132, наверное, следующее значение 20180201?


Вот на песочнице было все равно, лишь бы влезало в границы. А на боевой - почему-то отказывается
...
Рейтинг: 0 / 0
Exchange partition
    #39596645
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по полю какого типа секционирование?
сперва кажется, что по дате, и что даты заданы стринговыми литералами.
зетем констрэйнт вдруд по int-ам, которые, если перевести на даты, вообще другие границы задают.
или поле вообще char?
...
Рейтинг: 0 / 0
Exchange partition
    #39596650
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gollum...

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

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

Код: sql
1.
ALTER TABLE TMP_F_table WITH CHECK CHECK CONSTRAINT all
...
Рейтинг: 0 / 0
Exchange partition
    #39598053
Gollum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggsterALTER TABLE TMP_F_table WITH CHECK CHECK CONSTRAINT all


Нет, не помогло
...
Рейтинг: 0 / 0
Exchange partition
    #39598093
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
про тип колонки ответьте,
а то секционирование точно не по инту,
а зато check constraint как раз по нему
...
Рейтинг: 0 / 0
Exchange partition
    #39598331
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
причина всему -- ваш бардак с типами .
функция секционирования уже криво определена:
зачем писать строки, если вы секционируете целые числа?
но сервер молча проглотил, а вы, видимо, решили, что какая вообще разница, числа или строки.

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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.


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

Код: sql
1.
2.
3.
4.
5.
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.



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

Код: sql
1.
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 удовлетворяет вашей дурацкой строковой функции:
Код: sql
1.
2.
3.
4.
declare @int int = 20180199
select case when @int between '20180101' and '20180201' then 'yes' else 'no' end
---
yes



но НЕ удовлетворяет констрэйнту.
и поэтому никого уже не интересует одинаковость схем.
------------
теперь 2 вопроса:
1) зачем в функции использованы строки, если вы секционируете по числам?
2) зачем констрэйнт, если ваша темповая таблица и без того на той же схеме?
...
Рейтинг: 0 / 0
Exchange partition
    #39598338
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgУ вас же в функции нету 20180132, наверное, следующее значение 20180201?
Значит, надо ([KEY_DATE_START]>=(20180101) AND [KEY_DATE_START]<(20180201))

Ещё, в функции у вас границы задаются как строки (почему, интересно, для типа int???)
Тогда нужно и в чек-кронстрейне задавать как строки, как я понимаю.
Очень оно чувствительно.
вообще катит и с целыми в констрэйнте,
но диапазон, разумеется, надо брать ваш, а не ТС.
ну и да, зачем же задавать числа строками?
мне тоже совершенно непонятно
...
Рейтинг: 0 / 0
Exchange partition
    #39602090
Gollum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123про тип колонки ответьте,
а то секционирование точно не по инту


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


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

И функция по нему, и прекрасно работает. И exchange partition прекрасно работает с точно такой же по структуре таблице
...
Рейтинг: 0 / 0
Exchange partition
    #39602093
Gollum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123если ваша темповая таблица и без того секционирована

Именно потому, что она не партиционирована, и создается констрейнт. Но Вам, похоже, все равно, Вы пишете, а не читаете...
...
Рейтинг: 0 / 0
Exchange partition
    #39602125
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GollumYasha123если ваша темповая таблица и без того секционирована

Именно потому, что она не партиционирована, и создается констрейнт. Но Вам, похоже, все равно, Вы пишете, а не читаете...
это вы не читаете.
констрэйнт по диапазону int не эквивалентен диапазонам секциониррвания по строкам
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Exchange partition
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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