Загадка сообщения внутреннего исключения try-catch SQL Server

Следующий ниже оператор SQL является хорошим примером некоторого SQL, который вызывает исключение с вложенными деталями. Похоже, что в части catch оператора я могу получить только детали внешнего исключения Не удалось создать ограничение. См. Предыдущие ошибки (не очень полезно!). Я хочу получить внутреннее сообщение об исключении:

Введение ограничения FOREIGN KEY 'FK_TWO' в таблице 'TABLE2' может вызвать циклы или несколько каскадных путей. Укажите ON DELETE NO ACTION или ON ОБНОВЛЕНИЕ БЕЗ ДЕЙСТВИЙ или изменение других Ограничения FOREIGN KEY (вы можете получить это сообщение, запустив код без try-catch).

Как этого можно достичь в T-SQL в блоке Catch?

BEGIN TRY
      BEGIN TRAN;

        CREATE TABLE TABLE1 (USER_ID INTEGER NOT NULL PRIMARY KEY, USER_NAME
            CHAR(50) NOT NULL);

        CREATE TABLE TABLE2 (AUTHOR_ID INTEGER NOT NULL PRIMARY KEY, AUTHOR_NAME
            CHAR(50) NOT NULL, LASTMODIFIEDBY INTEGER NOT NULL, ADDEDBY INTEGER NOT
            NULL);

        ALTER TABLE TABLE2 ADD CONSTRAINT FK_ONE FOREIGN KEY (LASTMODIFIEDBY)
            REFERENCES TABLE1 (USER_ID) ON DELETE CASCADE ON UPDATE CASCADE;

        ALTER TABLE TABLE2 ADD CONSTRAINT FK_TWO FOREIGN KEY (ADDEDBY)
            REFERENCES TABLE1(USER_ID) ON DELETE NO ACTION ON UPDATE CASCADE;   

        COMMIT TRAN;
END TRY
BEGIN CATCH

      DECLARE @ERROR_MSG NVARCHAR(MAX), @SEVERITY INT, @STATE INT
      SELECT @SEVERITY = ERROR_SEVERITY(), @STATE = ERROR_STATE()
            , @ERROR_MSG = ERROR_MESSAGE() + ' err src line: ' + CAST( ERROR_LINE() AS NVARCHAR(20)) + ' ' + ISNULL(ERROR_PROCEDURE(), ''); 

      ROLLBACK;
      -- RE-THROW EXCEPTION FOR DIAGNOSTIC VISIBILITY
      RAISERROR (@ERROR_MSG ,@SEVERITY, @STATE); 
END CATCH;

[Edit]

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

7
задан James 7 December 2010 в 18:36
поделиться