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

Откуда: Екб
Сообщений: 1178
Доброго времени суток!
Есть довольно дурная задача, от которой не отвертеться и которую все равно пришлось сделать. Суть в том, что ночью в запускаемой джобом процедуре приходится у ряда таблиц отключать констрейны и триггера, править ключевые поля и включать обратно. Все работает верно, но таблицы большие и "ALTER TABLE WITH CHECK CHECK" работает по всем медленно.
Хочется все же, каждый отдельный такой объект обрабатывать в отдельной транзакции, чтобы при непрохождении чека все откатилось и в кэтче включить констрейны обратно. Т.е. время растет пропорционально кол-ву заданий.
Нет ли какойто хитрости, чтобы выполнять проверку ALTER TABLE WITH CHECK CHECK не по всей таблице, а только по откорректированным записям?

з.ы. Вариант сгруппировать задания - т.е. отключить, в транзакции сделать изменения по всем заданиям а потом вкючить обратно я конечно рассматриваю, но в таком случае ошибка по одному из заданий откатит все.
8 ноя 19, 14:33    [22012367]     Ответить | Цитировать Сообщить модератору
 Re: отключение констрейнов  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6954
denis_viktorovich,

а с какой целью Вы отключаете? Если не будете отключать, то проверяются как раз только изменённые.
8 ноя 19, 14:43    [22012375]     Ответить | Цитировать Сообщить модератору
 Re: отключение констрейнов  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6684
Владислав Колосов
denis_viktorovich,

а с какой целью Вы отключаете? Если не будете отключать, то проверяются как раз только изменённые.

хочет быстро вставлять и медленно проверять
8 ноя 19, 14:50    [22012382]     Ответить | Цитировать Сообщить модератору
 Re: отключение констрейнов  [new]
denis_viktorovich
Member

Откуда: Екб
Сообщений: 1178
Владислав Колосов,
То что надо делать противоречил логике системы. есть заказ, есть позиция дерева заказа, по позиции есть набор операций,
плановых позиций, параметров, параметров-параметров :-) и т.д. c довольно глубокой вложенностью.
У всех этих объектов в составной ключ входит этот ид заказа, он входит во все констрейны и проверки (для проверки на наличия объекта к которому относится параметр и на зависимыеобъекты). Мне надо кусок ветки дерева начиная с некоей сборочной одного заказа поменять местами с такой же сборочной в другом.
8 ноя 19, 15:04    [22012398]     Ответить | Цитировать Сообщить модератору
 Re: отключение констрейнов  [new]
denis_viktorovich
Member

Откуда: Екб
Сообщений: 1178
т.е. отвечаю на вопрос - с какой целью отключаю:
Если не отключать сразу падает, т.к. много таблиц. мне надо поменять все разом, а затем включить и проверить.
8 ноя 19, 15:09    [22012400]     Ответить | Цитировать Сообщить модератору
 Re: отключение констрейнов  [new]
1C Developer
Member

Откуда:
Сообщений: 51
Предлагать переписать констрейны и триггеры так, что бы операция замены Ваших <<поддеревьев>> проходила без их отключения (для корректных данных) не предлагать?
8 ноя 19, 15:52    [22012436]     Ответить | Цитировать Сообщить модератору
 Re: отключение констрейнов  [new]
Gerros
Member

Откуда: Харьков
Сообщений: 480
denis_viktorovich,

два заказа, А и Б, у первого есть ветка Х, у второго У, нужно поменять Х и У местами, так?

не трогаем констрейны. ветки переставляем через временный заказ:
создаём пустой временный заказ О, копируем в него из А ветку Х.
в заказе А удаляем ветку Х, копируем туда ветку У из заказа Б.
в заказе Б удаляем ветку У, копируем туда ветку Х из О.
удаляем заказ О.
8 ноя 19, 16:12    [22012456]     Ответить | Цитировать Сообщить модератору
 Re: отключение констрейнов  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6684
Gerros
denis_viktorovich,

два заказа, А и Б, у первого есть ветка Х, у второго У, нужно поменять Х и У местами, так?

не трогаем констрейны. ветки переставляем через временный заказ:
создаём пустой временный заказ О, копируем в него из А ветку Х.
в заказе А удаляем ветку Х, копируем туда ветку У из заказа Б.
в заказе Б удаляем ветку У, копируем туда ветку Х из О.
удаляем заказ О.

1. зачем всё это копируем вставляем, если по факту надо просто менять мастер всей ветки
2. создавать всё время тоже не обязательно, может всё время лежать инитный владелец на который всё перевешивается и потом снимается
8 ноя 19, 16:18    [22012463]     Ответить | Цитировать Сообщить модератору
 Re: отключение констрейнов  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6954
denis_viktorovich,

единственный способ гарантировать целостность таблицы - это проверка всей таблицы после отключения и включения проверочного ограничения. Или не отключайте или проверяйте всё. Если действительно хотите проверить.
8 ноя 19, 16:20    [22012468]     Ответить | Цитировать Сообщить модератору
 Re: отключение констрейнов  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6954
Сами ключи, как правило, не изменяют ввиду большую накладных расходов на поддержание целостности. Используют суррогатные ключи, если натуральные по каким-то причинам могут быть изменены.
8 ноя 19, 16:24    [22012470]     Ответить | Цитировать Сообщить модератору
 Re: отключение констрейнов  [new]
denis_viktorovich
Member

Откуда: Екб
Сообщений: 1178
Gerros
denis_viktorovich,

два заказа, А и Б, у первого есть ветка Х, у второго У, нужно поменять Х и У местами, так?

не трогаем констрейны. ветки переставляем через временный заказ:
создаём пустой временный заказ О, копируем в него из А ветку Х.
в заказе А удаляем ветку Х, копируем туда ветку У из заказа Б.
в заказе Б удаляем ветку У, копируем туда ветку Х из О.
удаляем заказ О.


Такая схема отлично работает при перевешивании всех входящих из одной сборки в другую внутри заказа. С разными проблема в том, что к позиции дерева привязаны операции, к каждой операции план, потребность, сдача, оборудование, плановые ресурсы к каждому еще табличная часть в виде параметров. И практически в каждой внешнее ограничение по ключу содержащему ид заказа, т.е. если меняем заказ в позиции дерева повисают в воздухе техпроцесс, план и т.д., когда меняем в плане - повисают параметры.
У всех объектов есть свои уникальные ключ и в общем непонятно, зачем тут заказ в констрейнах, но система покупная и до поры не хотелось менять базовую структуру.
9 ноя 19, 09:25    [22012675]     Ответить | Цитировать Сообщить модератору
 Re: отключение констрейнов  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29580
denis_viktorovich
У всех объектов есть свои уникальные ключ и в общем непонятно, зачем тут заказ в констрейнах, но система покупная и до поры не хотелось менять базовую структуру.
Неправильная модель данных == страдания. Ничего не поделать.

PS Если система покупная, логично спросить про пути решения вашей задачи у поставщика.
9 ноя 19, 15:05    [22012773]     Ответить | Цитировать Сообщить модератору
 Re: отключение констрейнов  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29580
denis_viktorovich
И практически в каждой внешнее ограничение по ключу содержащему ид заказа, т.е. если меняем заказ в позиции дерева повисают в воздухе техпроцесс, план и т.д., когда меняем в плане - повисают параметры.
А что, просто проапдэйтить ID заказа в нескольких таблицах - такая сложная задача? Там что, к заказу привязаны миллиарды записей?
9 ноя 19, 15:07    [22012775]     Ответить | Цитировать Сообщить модератору
 Re: отключение констрейнов  [new]
Gerros
Member

Откуда: Харьков
Сообщений: 480
denis_viktorovich
проблема в том, что к позиции дерева привязаны операции, к каждой операции план, потребность, сдача, оборудование, плановые ресурсы к каждому еще табличная часть в виде параметров.
Что мешает склонировать все связанные сущности? У вас есть набор update-ов, переделайте его в наборов insert-ов и набор delete-ов.
10 ноя 19, 01:12    [22012926]     Ответить | Цитировать Сообщить модератору
 Re: отключение констрейнов  [new]
denis_viktorovich
Member

Откуда: Екб
Сообщений: 1178
Gerros,
привязки, например ид дерева и тп, как параметр входит например в учетный документ. Если вставлять и удалять то придется генерить новый ид, т.к. он уникальный.
11 ноя 19, 06:02    [22013197]     Ответить | Цитировать Сообщить модератору
 Re: отключение констрейнов  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4013
denis_viktorovich,

В некоторых случаях бывает прощу констрейнты дропнуть, потом создать. Даже при частичном обновлении данных.
11 ноя 19, 11:24    [22013355]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить