У меня есть 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
Как лучше всего решить эту проблему?
Спасибо, что прочитали.