Sql Server: вопрос по констрейнтам
От: зиг Украина  
Дата: 30.09.13 15:40
Оценка:
Возможно глупый вопрос...
У меня есть большое число в каком-то роде неконсистных данных (исторически). Т.е. существует неявный бизнес-констрейнт, когда поле в одной таблицы должно быть равным полю в другой, при соблюдении ряда условий.
И вот я хочу этот констрейнт сделать явным. Чтоб получать сообщения об ошибках когда оно пытается создать очередную inconsistent запись.
Но для этого надо дофига проапдейтить (и апдейт там блин нетривиальный нифига) существующих данных, чтоб добавить такой констрейнт...

вопрос: можно ли как-то избежать апдейта существующих данных? чтоб констрейнт начинал действовать только когда совершаем апдейт/удаляем данные. а текущие данные игнорировал.?
Re: Sql Server: вопрос по констрейнтам
От: BlackEric http://black-eric.lj.ru
Дата: 30.09.13 15:55
Оценка: 7 (2)
Здравствуйте, зиг, Вы писали:

зиг>вопрос: можно ли как-то избежать апдейта существующих данных? чтоб констрейнт начинал действовать только когда совершаем апдейт/удаляем данные. а текущие данные игнорировал.?


Ага. Можно прикрутить проверку в триггере например.

Или добавить CHECK Constraints (читать до конца)
https://github.com/BlackEric001
Re[2]: Sql Server: вопрос по констрейнтам
От: зиг Украина  
Дата: 30.09.13 16:43
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Здравствуйте, зиг, Вы писали:


зиг>>вопрос: можно ли как-то избежать апдейта существующих данных? чтоб констрейнт начинал действовать только когда совершаем апдейт/удаляем данные. а текущие данные игнорировал.?


BE>Ага. Можно прикрутить проверку в триггере например.


BE>Или добавить CHECK Constraints (читать до конца)


мне не совсем понятно.
там написано Use the WITH NOCHECK option of the ALTER TABLE statement to apply the new constraint only to newly added data.

Это значит что даже если я , после созданного no check констрейнта, работаю со старыми даными, апдейчу их например — они не будут проверяться? т.е. грубо говоря это работает только при инсерте новых данных, или апдейте данных вставленных после добавления констрейнта.. или как?
Re[3]: Sql Server: вопрос по констрейнтам
От: BlackEric http://black-eric.lj.ru
Дата: 30.09.13 19:04
Оценка: 4 (1) +2
Здравствуйте, зиг, Вы писали:

зиг>мне не совсем понятно.

зиг>там написано Use the WITH NOCHECK option of the ALTER TABLE statement to apply the new constraint only to newly added data.

зиг>Это значит что даже если я , после созданного no check констрейнта, работаю со старыми даными, апдейчу их например — они не будут проверяться? т.е. грубо говоря это работает только при инсерте новых данных, или апдейте данных вставленных после добавления констрейнта.. или как?

Насколько помнится — это означает не проверять данные в таблице в момент создания констрейна.
Дальше все будет проверяться.
https://github.com/BlackEric001
Re[4]: Sql Server: вопрос по констрейнтам
От: зиг Украина  
Дата: 03.10.13 15:30
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Здравствуйте, зиг, Вы писали:


зиг>>мне не совсем понятно.

зиг>>там написано Use the WITH NOCHECK option of the ALTER TABLE statement to apply the new constraint only to newly added data.

зиг>>Это значит что даже если я , после созданного no check констрейнта, работаю со старыми даными, апдейчу их например — они не будут проверяться? т.е. грубо говоря это работает только при инсерте новых данных, или апдейте данных вставленных после добавления констрейнта.. или как?

BE>Насколько помнится — это означает не проверять данные в таблице в момент создания констрейна.
BE>Дальше все будет проверяться.

ok.... спасибо.
вопрос.
можно ли временно отключить проверку констрейнта, а потом включить опять? насколько это быстрая операция?
дело в том что хранимая процедура вначале удаляет записи, а потом инсертит (да,глупо, но там "надо"). и вот в момент между удалением и реинсертом, происходит нарушение констрейнта, которое хотелось бы игнорировать.
можно так сделать???
Re[5]: Sql Server: вопрос по констрейнтам
От: BlackEric http://black-eric.lj.ru
Дата: 03.10.13 16:15
Оценка: 3 (1)
Здравствуйте, зиг, Вы писали:

зиг>ok.... спасибо.

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


  ALTER TABLE t_name NOCHECK CONSTRAINT ALL

или вместо ALL указать имя констрейнта.
Для включения сделать check

Подробности ALTER TABLE (Transact-SQL)

Устроит ли вас по скорости
https://github.com/BlackEric001
Re[6]: Sql Server: вопрос по констрейнтам
От: зиг Украина  
Дата: 03.10.13 16:41
Оценка:
Здравствуйте, BlackEric, Вы писали:


BE>
BE>  ALTER TABLE t_name NOCHECK CONSTRAINT ALL
BE>

BE>или вместо ALL указать имя констрейнта.
BE>Для включения сделать check

BE>Подробности ALTER TABLE (Transact-SQL)


BE>Устроит ли вас по скорости

я имею ввиду эта скорость фиксированная или зависит от сложности констрейнта??? будет ли он допустим при включении констрейнта обратно, — проверять чтонибудь в таблице?
Я щас не могу проверить к сожалению, т.к. констрейнт пока не сделали... там сложная функция внутри, надо ее еще написать вначале
Re[7]: Sql Server: вопрос по констрейнтам
От: BlackEric http://black-eric.lj.ru
Дата: 04.10.13 09:17
Оценка:
Здравствуйте, зиг, Вы писали:

BE>>Устроит ли вас по скорости

зиг>я имею ввиду эта скорость фиксированная или зависит от сложности констрейнта??? будет ли он допустим при включении констрейнта обратно, — проверять чтонибудь в таблице?
зиг>Я щас не могу проверить к сожалению, т.к. констрейнт пока не сделали... там сложная функция внутри, надо ее еще написать вначале

Не скажу. Я их отключал только для пакетной вставки.
Проверьте на простейшем случае вида col1 > 0 на любой тестовой бд и расскажите
https://github.com/BlackEric001
Re[8]: Sql Server: вопрос по констрейнтам
От: зиг Украина  
Дата: 04.10.13 16:27
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Здравствуйте, зиг, Вы писали:


BE>>>Устроит ли вас по скорости

зиг>>я имею ввиду эта скорость фиксированная или зависит от сложности констрейнта??? будет ли он допустим при включении констрейнта обратно, — проверять чтонибудь в таблице?
зиг>>Я щас не могу проверить к сожалению, т.к. констрейнт пока не сделали... там сложная функция внутри, надо ее еще написать вначале

BE>Не скажу. Я их отключал только для пакетной вставки.

BE>Проверьте на простейшем случае вида col1 > 0 на любой тестовой бд и расскажите

не получится сделать это, т.к. alter statements запрещены юзеру под которым запускается хранимая процедура... по другому никак нельзя задизейблить констрейнт?
Re[9]: Sql Server: вопрос по констрейнтам
От: BlackEric http://black-eric.lj.ru
Дата: 04.10.13 16:38
Оценка:
Здравствуйте, зиг, Вы писали:

зиг>не получится сделать это, т.к. alter statements запрещены юзеру под которым запускается хранимая процедура... по другому никак нельзя задизейблить констрейнт?


Удалить?
https://github.com/BlackEric001
Re[10]: Sql Server: вопрос по констрейнтам
От: зиг Украина  
Дата: 04.10.13 16:48
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Здравствуйте, зиг, Вы писали:


зиг>>не получится сделать это, т.к. alter statements запрещены юзеру под которым запускается хранимая процедура... по другому никак нельзя задизейблить констрейнт?


BE>Удалить?


так удалениие констрейнта это тоже alter операция?
а может есть какая то системная хранимка которая это делает?? (дизейблит констр).. тогда можно попросить DBA дать права на ее выполнение
Re[9]: Sql Server: вопрос по констрейнтам
От: wildwind Россия  
Дата: 04.10.13 18:28
Оценка:
Здравствуйте, зиг, Вы писали:

зиг>не получится сделать это, т.к. alter statements запрещены юзеру под которым запускается хранимая процедура... по другому никак нельзя задизейблить констрейнт?


На то он и констрейнт, чтобы его нельзя было обойти обычному юзеру.
Re[9]: Sql Server: вопрос по констрейнтам
От: Kubyshev Andrey  
Дата: 15.10.13 12:27
Оценка:
зиг>не получится сделать это, т.к. alter statements запрещены юзеру под которым запускается хранимая процедура... по другому никак нельзя задизейблить констрейнт?

Вроде можно повысить привилегии всей процедуре. Сделать ее execute as ...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.