【发布时间】:2020-03-19 10:19:14
【问题描述】:
我有一个 SQL 触发器,它依赖于同一服务器中的一个单独的数据库,但是当一个人想要独立使用该数据库时就会出现问题,在这种情况下,通常不会迁移第二个数据库。这意味着,如果要执行会激活触发器的查询,它将由于需要第二个数据库而失败。
我试图通过使用检查数据库是否存在的脚本覆盖整个触发器来规避该问题,但即使我确实包含它,它基本上也会检查整个触发器并且无论如何都会失败。下面是我在没有第二个数据库的 SQL 服务器中插入记录时发生的情况。
Msg 2702, Level 16, State 2, Procedure tChange2ndDB, Line 22 [Batch Start Line 0]
Database '2ndDB' does not exist.
这是我当前(基本)代码的样子:
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
解决此问题的最佳解决方案是什么?
感谢您的阅读。
【问题讨论】:
-
您将触发器添加到哪个数据库?
-
此类触发器同时出现在主数据库 (1stDB) 和辅助数据库 (2ndDB) 上,目的是同步 2ndDB 中与 1stDB 中具有匹配表的特定表。
标签: sql-server triggers