Неверное имя объекта для таблицы, которая успешно обновлена ​​в той же хранимой процедуре - PullRequest
2 голосов
/ 01 июля 2011

Мы наблюдаем «интересное поведение» с нашей базой данных SQL Server.У нас есть оператор слияния, который выбирает таблицу X. В предложениях match есть подвыбор таблицы X. Когда мы выполняем хранимую процедуру из SQL Server Tools, она работает нормально.Но при выполнении из IPC (ETL Tool) мы получаем исключение Invalid object name 'X'.

Пока что ничего особенного, насколько я понимаю, не может многое сделать неправильно с разрешениями и прочим.

Странная вещь: оператор merge находится в блоке try, а в блоке catch сообщение об ошибке записывается в таблицу X с помощью оператора update!Как это возможно, когда Sql Server жалуется, что не может найти таблицу X?

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

Код выглядит следующим образом

    merge ...
    using
    (select ...
    from dbo.X
    where ...
    when not matched by target 
    and not exists (select 1 from dbo.X q2 where ...)
    then insert (...
    )
    values (...
    )
    when matched and q.ACTION='D'
    then delete
    when matched AND NOT exists (select 1 from dbo.X q3 where ...)
    then update 
    set
      ...

    OUTPUT $action INTO @l_SummaryOfChanges;
    -- Query the results of the table variable.
    SELECT ACTION, COUNT(*) AS CountPerChange
    FROM @l_SummaryOfChanges
    GROUP BY ACTION;
  end try
  begin catch
    update dbo.X
    set LAST_ERROR_MSG=ERROR_MESSAGE(), ERROR_COUNTER=ERROR_COUNTER+1
    where SYNC_ID=@l_SyncID
  end catch

Есть идеи, что происходит? Неверное имя объекта 'sync $ _tabTeiledaten'.

1 Ответ

2 голосов
/ 01 июля 2011

Мы нашли это. Вопрос Гбн вызвал осознание того, что использование X не имеет ничего общего с исключением. Фактически в целевой таблице слияния был триггер, который ссылается на X, но из другой схемы без фактического указания схемы.

Пусть кто-нибудь получит пользу от того, как мы отладили это дерьмо:

  • мы продублировали X с новым именем (Y) и по-прежнему получили сообщение об ошибке «Недопустимое имя объекта« X ». Тогда мы подумали, что можем ссылаться на представление или что-то в этом роде.
  • мы удалили все столбцы (там, где их много) из оператора слияния, кроме тех, которые, где необходимо, из-за ненулевых ограничений. Проблема сохранилась
  • Мы удалили 1 ветвь оператора слияния за раз. Проблема сохранилась.
  • мы удалили полный оператор слияния. Ошибка исчезла. В этот момент мы поняли, что с целевой таблицей может продолжаться что-то подозрительное.
  • При осмотре мы нашли спусковой крючок из ада.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...