【问题标题】:Check if DB Exists in a Trigger检查触发器中是否存在数据库
【发布时间】: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


【解决方案1】:

您可以尝试添加 Else,然后使用 RETURN 0 或 '' 不执行您的代码。

【讨论】:

  • 不,这不起作用。使用“返回 0”,我收到此消息(无法更新):Msg 178,Level 15,State 1,Procedure tChange2ndDB,Line 43 [Batch Start Line 2] A RETURN statement with a return value cannot be used in this context .另外,我使用了“PRINT ''”,在这种情况下,当我插入记录时我会得到这个:Msg 2702, Level 16, State 2, Procedure tChange2ndDB, Line 21 [Batch Start Line 0] Database '2ndDB' does not exist .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-26
  • 1970-01-01
  • 2010-10-22
相关资源
最近更新 更多