Можно ли отложить проверку ссылочной целостности до конца транзакции в SQL Server?

Недавно я прочитал в PofEA Фаулера, что некоторые механизмы баз данных позволяют откладывать проверки RI до конца транзакции. Возможно ли это в SQL Server?

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


person Darrel Miller    schedule 25.08.2009    source источник
comment
Вы можете сделать это, отключив/включив ограничения в начале и конце sproc, но это настолько пугающий маршрут, что я бы действительно поставил под сомнение приложение и/или модель данных.   -  person OMG Ponies    schedule 25.08.2009


Ответы (4)


Похоже, что сервер sql не позволяет этого, но вы не являетесь только один, кто этого хочет. Это часть стандарта SQL 92, поэтому у них было 17 лет, чтобы понять это. Опять же, MySQL его тоже не поддерживает (хотя Oracle поддерживает).

Изменение порядка операторов, вероятно, является вашим лучшим вариантом.

person Eric Petroelje    schedule 25.08.2009
comment
Фу. Есть гораздо более полезные вещи, которые они должны реализовать. Пакеты, актуальный синтаксис для иерархических запросов... - person OMG Ponies; 25.08.2009
comment
Спасибо за ссылку. Рад узнать, что я не единственный, кто думает, что это было бы полезно. - person Darrel Miller; 25.08.2009

Вам лучше определить правильный порядок, чтобы транзакция могла завершиться неудачей в нужное время. Это должно быть разовое решение.

person Adam Robinson    schedule 25.08.2009
comment
Дело в том, что транзакция не должна провалиться. Неудачная проверка RI будет неактуальна к концу транзакции, поскольку связанные строки будут удалены. Это также пустая трата времени, чтобы сделать проверку. - person Darrel Miller; 25.08.2009
comment
Не должно, но может. Хотя эта функция может присутствовать в других СУБД, мне она кажется очень вонючей. Не должно быть так сложно определить правильный порядок выполнения. - person Adam Robinson; 25.08.2009
comment
Что ж, вам это может показаться вонючим, но Мартин Фаулер считает, что это полезно, и стандарт ANSI SQL-92 говорит, что именно так это и должно работать, так что этого достаточно для меня :-) - person Darrel Miller; 25.08.2009

SQL Server не имеет этой функции.

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

person Cade Roux    schedule 25.08.2009
comment
Дело не в том, что я не знаю порядка вставки, но я использую базовую ORM, которая будет либо ВСТАВЛЯТЬ, либо УДАЛИТЬ в зависимости от состояния объектов. Если у меня есть код, который говорит A.Save(); Б.Сохранить(); С.Сохранить(); а те сейвы делают INSERTы то все хорошо. Однако, если эти объекты были удалены, мне действительно нужно выполнить C.Save(); Б.Сохранить(); А.Сохранить(); - person Darrel Miller; 25.08.2009

Если вы используете SQL Server 2008, вы можете использовать MERGE для объединения вставить/удалить в одну транзакцию, безопасную для RI...

person gbn    schedule 25.08.2009