SQL: считается ли отключение триггеров изменением схемы? ("Не удалось завершить операцию курсора, так как изменилась схема таблицы")


Считается ли отключение триггеров изменением схемы в SQL Server? Я получаю ошибку: "не удалось завершить операцию курсора, потому что схема таблицы изменилась"

У меня есть хранимая процедура p_DeleteA, которая удаляет строку из таблицы A и все ее дочерние записи из таблицы B; однако, поскольку строка в таблице B удаляется, записи внука в таблице C, D и E также удаляются. Вышесказанное реализуется курсором вокруг таблицы B, где AId = xyz, затем вызывает p_DeleteB, который удаляет C, D, и записи E, затем B.

В базе данных разработки процедура работает нормально. Однако в среде сборки возникает вышеупомянутая ошибка. Единственное, что я могу представить себе как "изменение схемы", - это тот факт, что триггеры отключаются, чтобы не наступать друг на друга в таблице B. считается ли отключение триггеров изменением схемы? Если нет, то что может вызвать сообщение об ошибке, предполагая, что я не изменяю схему в середине. Autoshrink, который я читал может вызвать эта ошибка, отключена.

Edit : я эмулирую каскадное удаление, но вручную удаляю все записи.

Версия среды разработки: 9.00.4035.00
Версия среды сборки: 9.00.1399.00

4 3

4 ответа:

Да. Триггер create / drop/alter представляет собой изменение схемы в таблице и запускает перекомпиляцию и делает недействительными динамические курсоры.

Думая, что я нажимаю KB930775: FIX: сообщение об ошибке при попытке извлечь строки из курсора, который использует опцию (перекомпиляция) подсказка запроса в SQL Server 2005: "не удалось завершить операцию курсора, потому что схема таблицы изменилась после объявления курсора или другой известной проблемы, я обновил до SP3, но не решил проблему.

Объявление курсора локальным и статическим, казалось, сделало трюк:

DECLARE BCursor CURSOR LOCAL STATIC
FOR
    SELECT BId
    FROM B
    WHERE AId = @AId

См. объявить курсор (Transact-SQL) .

Статика
Определяет курсор, который делает временную копию данных, которые будут использоваться по курсору. Все запросы к на этот вопрос мы отвечаем: временная таблица в tempdb; поэтому, изменения, внесенные в базовые таблицы: не отражается в данных, возвращаемых выборки, сделанные к этому курсору, и это курсор не допускает изменений.

Добавление или удаление триггеров - это изменение схемы. триггеры-это мир боли из-за этих точных типов недетерминированных побочных эффектов, управляемых данными. всегда избегайте триггеров, потому что они делают вашу таблицу dml неортогональной.

Итак... курсор ожидает, что записи будут в других таблицах, но затем обнаруживает, что их нет.

Но я в замешательстве - у вас есть каскадные удаления, включенные, или вы сами их удаляете? Вы говорите о курсоре, который вызывает p_DeleteB,что не похоже на каскадное удаление.

На самом деле, похоже, что у вас нет реализованного FKs, что тоже не очень хорошо.

Если бы я был на вашем месте, я бы посмотрел на это без курсора вообще - это вполне может решить проблему. ваша проблема, как и без курсора, опора на схему не должна быть там.