Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Exchange partition / 15 сообщений из 15, страница 1 из 1
03.02.2018, 17:34
    #39596104
Gollum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exchange partition
Таблица фактов с партиционированием:

Код: 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
03.02.2018, 20:57
    #39596187
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exchange partition
Gollum,

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

Не понятен описанных порядок ваших действий. Сначала перенесли данные в пустую секцию, а только потом создаете ограничение?
автор- создаю констрейнт WITH CHECK на таблице TMP_F_table
Какой-то бред.
...
Рейтинг: 0 / 0
03.02.2018, 22:19
    #39596209
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exchange partition
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
03.02.2018, 22:19
    #39596210
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exchange partition
nvvавтор- создаю констрейнт WITH CHECK на таблице TMP_F_table
Какой-то бред.Ээээ, разве можно по другому? Как именно, подскажите?
...
Рейтинг: 0 / 0
05.02.2018, 11:46
    #39596638
Gollum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exchange partition
alexeyvgНадо, что бы констрейн точно соответствовал условиям функции.
У вас же в функции нету 20180132, наверное, следующее значение 20180201?


Вот на песочнице было все равно, лишь бы влезало в границы. А на боевой - почему-то отказывается
...
Рейтинг: 0 / 0
05.02.2018, 11:59
    #39596645
Yasha123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exchange partition
по полю какого типа секционирование?
сперва кажется, что по дате, и что даты заданы стринговыми литералами.
зетем констрэйнт вдруд по int-ам, которые, если перевести на даты, вообще другие границы задают.
или поле вообще char?
...
Рейтинг: 0 / 0
05.02.2018, 12:08
    #39596650
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exchange partition
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
07.02.2018, 11:49
    #39598053
Gollum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exchange partition
uaggsterALTER TABLE TMP_F_table WITH CHECK CHECK CONSTRAINT all


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

ну а теперь репро (хотя и не совсем той ошибки):
создаю 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
07.02.2018, 16:43
    #39598338
Yasha123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exchange partition
alexeyvgУ вас же в функции нету 20180132, наверное, следующее значение 20180201?
Значит, надо ([KEY_DATE_START]>=(20180101) AND [KEY_DATE_START]<(20180201))

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


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


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

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

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

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


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