Возможно глупый вопрос...
У меня есть большое число в каком-то роде неконсистных данных (исторически). Т.е. существует неявный бизнес-констрейнт, когда поле в одной таблицы должно быть равным полю в другой, при соблюдении ряда условий.
И вот я хочу этот констрейнт сделать явным. Чтоб получать сообщения об ошибках когда оно пытается создать очередную inconsistent запись.
Но для этого надо дофига проапдейтить (и апдейт там блин нетривиальный нифига) существующих данных, чтоб добавить такой констрейнт...
вопрос: можно ли как-то избежать апдейта существующих данных? чтоб констрейнт начинал действовать только когда совершаем апдейт/удаляем данные. а текущие данные игнорировал.?
Здравствуйте, зиг, Вы писали:
зиг>вопрос: можно ли как-то избежать апдейта существующих данных? чтоб констрейнт начинал действовать только когда совершаем апдейт/удаляем данные. а текущие данные игнорировал.?
Ага. Можно прикрутить проверку в триггере например.
Здравствуйте, 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 констрейнта, работаю со старыми даными, апдейчу их например — они не будут проверяться? т.е. грубо говоря это работает только при инсерте новых данных, или апдейте данных вставленных после добавления констрейнта.. или как?
Здравствуйте, зиг, Вы писали:
зиг>мне не совсем понятно. зиг>там написано Use the WITH NOCHECK option of the ALTER TABLE statement to apply the new constraint only to newly added data.
зиг>Это значит что даже если я , после созданного no check констрейнта, работаю со старыми даными, апдейчу их например — они не будут проверяться? т.е. грубо говоря это работает только при инсерте новых данных, или апдейте данных вставленных после добавления констрейнта.. или как?
Насколько помнится — это означает не проверять данные в таблице в момент создания констрейна.
Дальше все будет проверяться.
Здравствуйте, 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.... спасибо.
вопрос.
можно ли временно отключить проверку констрейнта, а потом включить опять? насколько это быстрая операция?
дело в том что хранимая процедура вначале удаляет записи, а потом инсертит (да,глупо, но там "надо"). и вот в момент между удалением и реинсертом, происходит нарушение констрейнта, которое хотелось бы игнорировать.
можно так сделать???
Здравствуйте, зиг, Вы писали:
зиг>ok.... спасибо. зиг>вопрос. зиг>можно ли временно отключить проверку констрейнта, а потом включить опять? насколько это быстрая операция? зиг>дело в том что хранимая процедура вначале удаляет записи, а потом инсертит (да,глупо, но там "надо"). и вот в момент между удалением и реинсертом, происходит нарушение констрейнта, которое хотелось бы игнорировать. зиг>можно так сделать???
ALTER TABLE t_name NOCHECK CONSTRAINT ALL
или вместо ALL указать имя констрейнта.
Для включения сделать check
BE>или вместо ALL указать имя констрейнта. BE>Для включения сделать check
BE>Подробности ALTER TABLE (Transact-SQL)
BE>Устроит ли вас по скорости
я имею ввиду эта скорость фиксированная или зависит от сложности констрейнта??? будет ли он допустим при включении констрейнта обратно, — проверять чтонибудь в таблице?
Я щас не могу проверить к сожалению, т.к. констрейнт пока не сделали... там сложная функция внутри, надо ее еще написать вначале
Здравствуйте, зиг, Вы писали:
BE>>Устроит ли вас по скорости зиг>я имею ввиду эта скорость фиксированная или зависит от сложности констрейнта??? будет ли он допустим при включении констрейнта обратно, — проверять чтонибудь в таблице? зиг>Я щас не могу проверить к сожалению, т.к. констрейнт пока не сделали... там сложная функция внутри, надо ее еще написать вначале
Не скажу. Я их отключал только для пакетной вставки.
Проверьте на простейшем случае вида col1 > 0 на любой тестовой бд и расскажите
Здравствуйте, BlackEric, Вы писали:
BE>Здравствуйте, зиг, Вы писали:
BE>>>Устроит ли вас по скорости зиг>>я имею ввиду эта скорость фиксированная или зависит от сложности констрейнта??? будет ли он допустим при включении констрейнта обратно, — проверять чтонибудь в таблице? зиг>>Я щас не могу проверить к сожалению, т.к. констрейнт пока не сделали... там сложная функция внутри, надо ее еще написать вначале
BE>Не скажу. Я их отключал только для пакетной вставки. BE>Проверьте на простейшем случае вида col1 > 0 на любой тестовой бд и расскажите
не получится сделать это, т.к. alter statements запрещены юзеру под которым запускается хранимая процедура... по другому никак нельзя задизейблить констрейнт?
Здравствуйте, зиг, Вы писали:
зиг>не получится сделать это, т.к. alter statements запрещены юзеру под которым запускается хранимая процедура... по другому никак нельзя задизейблить констрейнт?
Здравствуйте, BlackEric, Вы писали:
BE>Здравствуйте, зиг, Вы писали:
зиг>>не получится сделать это, т.к. alter statements запрещены юзеру под которым запускается хранимая процедура... по другому никак нельзя задизейблить констрейнт?
BE>Удалить?
так удалениие констрейнта это тоже alter операция?
а может есть какая то системная хранимка которая это делает?? (дизейблит констр).. тогда можно попросить DBA дать права на ее выполнение
Здравствуйте, зиг, Вы писали:
зиг>не получится сделать это, т.к. alter statements запрещены юзеру под которым запускается хранимая процедура... по другому никак нельзя задизейблить констрейнт?
На то он и констрейнт, чтобы его нельзя было обойти обычному юзеру.
зиг>не получится сделать это, т.к. alter statements запрещены юзеру под которым запускается хранимая процедура... по другому никак нельзя задизейблить констрейнт?
Вроде можно повысить привилегии всей процедуре. Сделать ее execute as ...