Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server触发器可以自行禁用,还是自动禁用?_Sql Server_Triggers - Fatal编程技术网

Sql server SQL Server触发器可以自行禁用,还是自动禁用?

Sql server SQL Server触发器可以自行禁用,还是自动禁用?,sql-server,triggers,Sql Server,Triggers,我有一个SQL Server触发器,它为特定表中的行生成唯一的ID号 每隔几天,用户就会告诉我它已经停止生成ID。当我转到数据库(SSMS)并查看触发器时,它被禁用。我启用它,并正常处理简历 据我所知,禁用触发器的唯一方法是由管理员转到触发器,右键单击并选择“禁用”,或运行DDL脚本禁用它。管理员组中没有其他人承认禁用触发器 ALTER TRIGGER [dbo].[Create_Permalink] ON [dbo].[TABLE_NAME_1] AFTER INSERT AS

我有一个SQL Server触发器,它为特定表中的行生成唯一的ID号

每隔几天,用户就会告诉我它已经停止生成ID。当我转到数据库(SSMS)并查看触发器时,它被禁用。我启用它,并正常处理简历

据我所知,禁用触发器的唯一方法是由管理员转到触发器,右键单击并选择“禁用”,或运行DDL脚本禁用它。管理员组中没有其他人承认禁用触发器

ALTER TRIGGER [dbo].[Create_Permalink]
   ON  [dbo].[TABLE_NAME_1]
   AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;

    IF EXISTS (SELECT   * FROM TABLE_NAME_1 
                WHERE   (PermaLink IS NULL or Permalink = '')
                AND     Request_ID = (SELECT DISTINCT Request_ID FROM inserted)
                AND     AC_ID = (SELECT DISTINCT AC_ID FROM inserted)
                AND     Leg_ID  = (SELECT DISTINCT Leg_ID FROM inserted)
    )
    BEGIN

        declare @code nvarchar(32) = '';

        -------------------------------------------------
        -- GENERATE MULTI-PART ALPHANUMERIC IDCODE HERE
        -------------------------------------------------
        -- SET @code = ....Generated Code....


        UPDATE  TABLE_NAME_1 
        SET     PermaLink = @code
        WHERE   (PermaLink IS NULL or Permalink = '')
          AND   Request_ID = (SELECT DISTINCT Request_ID FROM inserted)
          AND   AC_ID = (SELECT DISTINCT AC_ID FROM inserted)
          AND   Leg_ID  = (SELECT DISTINCT Leg_ID FROM inserted)

    END
END
问题是:如果触发器失去网络连接,或进入递归循环,或在备份过程中,或诸如此类的情况下,触发器是否可能禁用自身

我需要一些方法来解释这东西是如何不断变弱的

奇怪的是,互联网对这一点保持沉默

编辑:日志文件似乎对此无话可说。此外,数据库是AAG可用性组的一部分

EDIT2:触发器的基本“代码”

ALTER TRIGGER [dbo].[Create_Permalink]
   ON  [dbo].[TABLE_NAME_1]
   AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;

    IF EXISTS (SELECT   * FROM TABLE_NAME_1 
                WHERE   (PermaLink IS NULL or Permalink = '')
                AND     Request_ID = (SELECT DISTINCT Request_ID FROM inserted)
                AND     AC_ID = (SELECT DISTINCT AC_ID FROM inserted)
                AND     Leg_ID  = (SELECT DISTINCT Leg_ID FROM inserted)
    )
    BEGIN

        declare @code nvarchar(32) = '';

        -------------------------------------------------
        -- GENERATE MULTI-PART ALPHANUMERIC IDCODE HERE
        -------------------------------------------------
        -- SET @code = ....Generated Code....


        UPDATE  TABLE_NAME_1 
        SET     PermaLink = @code
        WHERE   (PermaLink IS NULL or Permalink = '')
          AND   Request_ID = (SELECT DISTINCT Request_ID FROM inserted)
          AND   AC_ID = (SELECT DISTINCT AC_ID FROM inserted)
          AND   Leg_ID  = (SELECT DISTINCT Leg_ID FROM inserted)

    END
END

这不是我写的,所以我对它的作用没有任何发言权。

你的触发器中有一个明显的错误。它假设在任何时候只有一行被更新,这不可能总是这样。如果执行影响多行的更新,则插入的
表的内容将有多行,这意味着这将失败:

      AND   Request_ID = (SELECT DISTINCT Request_ID FROM inserted)
      AND   AC_ID = (SELECT DISTINCT AC_ID FROM inserted)
      AND   Leg_ID  = (SELECT DISTINCT Leg_ID FROM inserted)
它将返回一个错误,指示等号的右侧不是单个值


我不知道这是否是你看到的问题,但可能是。您确实需要首先修复此问题。

您可以检查以确定是否存在禁用触发器的存储过程。它可能有一个禁用命令,如果发生错误,不会重新启用该命令。

请发布触发器正文<代码>管理员组中没有其他人允许禁用触发器。
=>您也可以启动审核/扩展事件会话来拦截下一次事件。谢谢您,Lukasz。触发器主体代表重要的公司知识产权材料。我将不得不对它进行明显的模糊处理,或者对它的大部分进行修订。这个问题与触发器的主体无关。它很好用。我要问的是,除了有人故意禁用它之外,还有什么可能禁用它的方法。如果没有人可以提供指导,我将提供一个经过编辑的“为空间编辑”版本的正文。请发布触发器的类型,我不想知道您的表名和具体逻辑。唯一类型(而不是/AFTER)-它是表/数据库触发器,它是递归的还是非递归的。顺便说一句,您正在使用复制吗?集成工具,如SSIS/Informatica?是在插入之后,是的,数据库是AAG可用性组的一部分。好的,我看你不能发布更多。我建议对特定触发和/或扩展事件进行审计。等待相同的情况再次出现,并检查进行此更改的登录/用户/会话。这是一些后台进程(数据加载)或用户。很好的捕获。我一定会处理好的。我继承了这一点,所以谁知道我可能很快会遇到多少类似的问题这确实是问题所在。谢谢你给我指出那个方向。我没有考虑过。啊——而且提出的错误可能就是我指出的那个!好的解决方案分为两部分。