ADOQuery обходит вместо триггера удаления - PullRequest
3 голосов
/ 24 сентября 2010

Я использую Delphi 5 с SQL Server 2000 здесь.

Я создал ADOQuery поверх обновляемого представления с триггером INSTEAD OF DELETE.

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

Все работает нормально, когда я посылаю прямые команды DELETE в базу данных. Я удаляю запись в представлении, и базовая таблица обновляется, выполняя мягкое удаление, как и ожидалось.

Когда я пытаюсь использовать ADOQuery для удаления записи, он обходит представление и удаляет запись непосредственно в базовой таблице, поэтому триггер вместо удаления в представлении никогда не срабатывает.

Я также использую ссылочные ограничения, и из-за них происходит удаление из-за них, но я не знаю, имеет ли это значение. Этого не происходит при выдаче команд удаления в представление.

Кто-нибудь из вас знает, как обойти это раздражающее поведение?

1 Ответ

1 голос
/ 24 сентября 2010

Заметили, что вместо этого он удаляется непосредственно из основной таблицы? Вероятно, это связано с тем, что он обнаруживает, что это представление, и работает с самой базовой таблицей. Чтобы предотвратить это, объявите ваше представление WITH VIEW_METADATA, см. ALTER VIEW для получения дополнительной информации.

Тогда библиотека ADO будет рассматривать представление как таблицу. Имейте в виду, что вы могли бы получить нежелательные побочные эффекты, обманув свою библиотеку БД, как это, например, в случаях, когда удаление фактически не выполняется или оно выполняет обновление вместо удаления.

...