Проверьте, существует ли БД в триггере - PullRequest
0 голосов
/ 19 марта 2020

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

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

Msg 2702, Level 16, State 2, Procedure tChange2ndDB, Line 22 [Batch Start Line 0]
Database '2ndDB' does not exist.

Вот как выглядит мой текущий (базовый c) код:

CREATE TRIGGER [dbo].[tChange2ndDB] 
   ON  [dbo].[crelign] 
   AFTER INSERT,DELETE,UPDATE
AS 
BEGIN
IF (EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE ('[' + name + ']' = '[2ndDB]' OR name = '[2ndDB]')))
BEGIN
    SET NOCOUNT ON;

    BEGIN TRY
        DECLARE @insCount INT
        DECLARE @delCount INT
        DECLARE @Code VARCHAR(5)
        DECLARE @CodeUpd VARCHAR(5)
        DECLARE @Description VARCHAR(50)

        SET @insCount = (SELECT COUNT(*) FROM INSERTED)
        SET @delCount = (SELECT COUNT(*) FROM DELETED)

        ;IF (EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE ('[' + name + ']' = '[2ndDB]' OR name = '[2ndDB]')))
            ALTER TABLE [2ndDB].[dbo].Field DISABLE TRIGGER [tChange1stDB];

        -- * Other code here * --

        ;IF (EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE ('[' + name + ']' = '[2ndDB]' OR name = '[2ndDB]')))
            ALTER TABLE [2ndDB].[dbo].Field ENABLE TRIGGER [tChange1stDB];

    END TRY

    BEGIN CATCH
        -- * Error Handling --
        DECLARE @ErrMsg NVARCHAR(MAX), @ErrorSeverity INT, @ErrorState INT;

        SELECT @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE();

        SET @ErrMsg = (SELECT 'TR : tChange2ndDB Line : ' + RTRIM(CONVERT(VARCHAR(MAX), ERROR_LINE())) + ' - ' + ERROR_MESSAGE());

        RAISERROR(@ErrMsg, @ErrorSeverity, @ErrorState);
    END CATCH
END
END
GO

Как лучше всего решить эту проблему?

Спасибо, что прочитали.

1 Ответ

0 голосов
/ 20 марта 2020

Вы можете попробовать добавить Else, а затем использовать RETURN 0 или '', чтобы не вводить код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...