当前位置: 首页 > 面试题库 >

如何为SQL Server数据库中的所有表创建触发器

云捷
2023-03-14
问题内容

我的LastUpdate数据库的所有表中都有一列,我想说“在插入更新时LastUpdate = getdate()

我可以使用触发器来做到这一点,但是我发现很难为数据库的每个表编写数百个触发器。-如何动态创建影响所有表的触发器?-如何为每个表动态创建触发器?


问题答案:

更新任何表时都无法触发触发器。

您可以动态生成SQL Required,如下所示:

SELECT  N'
            CREATE TRIGGER trg_' + t.Name + '_Update ON ' + ObjectName + '
            AFTER UPDATE 
            AS 
            BEGIN
                UPDATE  t
                SET LastUpdate = GETDATE()
                FROM ' + o.ObjectName + ' AS t
                        INNER JOIN inserted AS i
                            ON ' + 
            STUFF((SELECT ' AND t.' + QUOTENAME(c.Name) + ' = i.' + QUOTENAME(c.Name)
                    FROM    sys.index_columns AS ic
                            INNER JOIN sys.columns AS c
                                ON c.object_id = ic.object_id
                                AND c.column_id = ic.column_id
                    WHERE   ic.object_id = t.object_id
                    AND     ic.index_id = ix.index_id
                    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 4, '') + ';
            END;
            GO'
FROM    sys.tables AS t
        INNER JOIN sys.indexes AS ix
            ON ix.object_id = t.object_id
            AND ix.is_primary_key = 1
        CROSS APPLY (SELECT QUOTENAME(OBJECT_SCHEMA_NAME(t.object_id)) + '.' + QUOTENAME(t.name)) o (ObjectName)
WHERE   EXISTS 
        (   SELECT  1 
            FROM    sys.columns AS c 
            WHERE   c.Name = 'LastUpdate' 
            AND     c.object_id = t.object_id
        );

为每个表生成带有LastUpdate一行的列的SQL :

CREATE TRIGGER trg_TableName_Update ON [dbo].[TableName]
AFTER UPDATE 
AS 
BEGIN
    UPDATE  t
    SET     LastUpdate = GETDATE()
    FROM    [dbo].[TableName] AS t
            INNER JOIN inserted AS i
                ON  t.[PrimaryKey] = i.[PrimaryKey];
END;
GO

依赖于每个具有主键的inserted表,以使表中的联接返回到要更新的表。

您可以复制并粘贴结果并执行它们(我建议这样做,这样您至少可以检查生成的SQL,或将其构建到游标中并使用来执行sp_executesql。我建议使用前者,即,使用它来保存有点时间,但是在实际创建触发器之前,仍然要检查每个触发器。

我个人认为最后修改的列是一个有缺陷的概念,在我看来,它总是像存储烦人的信息一样,如果您真的关心数据更改,然后使用审核表对其进行适当跟踪。首先,知道什么时候改变了,但是改变了什么,或者是谁改变了,这比根本不知道更令人讨厌,其次,它覆盖了以前的所有改变,是什么使最新的改变比以前的所有改变更重要。



 类似资料:
  • 本文向大家介绍如何列出MySQL数据库中的所有触发器?,包括了如何列出MySQL数据库中的所有触发器?的使用技巧和注意事项,需要的朋友参考一下 要列出MySQL数据库中的所有触发器,可以使用SHOW命令。查询如下- 以下是输出- 您可以在以下查询的帮助下访问information_schema表。 注意-您必须具有MySQL 5.0.10及更高版本。我目前正在使用MySQL版本8.0.12- 以下

  • 我有一个烧瓶API,我使用烧瓶SQLAlChemy来处理SQLite数据库。我有一个存储日志条目的表,我想将最大行数限制为n。因为插入也是使用原始SQL从烧瓶之外的另一个脚本进行的,所以我创建了一个触发器来检查行数,如果行数高于n,则删除最旧的行数: 此触发器按预期工作,但我正在努力使用烧瓶-sqlalChemy设置它。如何设置触发器/执行原始SQL使用烧瓶sqlalChemy?SQL只需要在db

  • 问题内容: 如何使用查询获取SQL Server数据库中所有表的列表。我的意图是将其动态显示在网页上。 问题答案: 尝试: 这应该给您您想要的。然后,您需要从网页中调用它,以所需格式显示。 您可能要看: 如何使用C#在组合框中从数据库获取所有表的名称 可能会帮助您完成您想做的事情。 另外-您可能想看一下SQL Server:我应该在sys表上使用information_schema表吗? 用于sy

  • 问题内容: 如何创建数据库触发器以将行更改记录到H2中的另一个表? 在MySQL中,这可以轻松完成: 问题答案: 声明此触发器: 使用Java / JDBC实现触发器: 用jOOQ实现触发器: 由于您在问题中添加了jOOQ标记,因此我怀疑这种替代方法也可能是相关的。您当然可以在H2触发器内使用jOOQ:

  • 我在anylogic中根据我创建的数据库表生成代理。在这个数据库中,我有我的代理的一些特征。这个代理应该是我的“调度代理”,因为我的重点是重新调度,所以我的生产订单必须保存为队列中的代理。我的问题是,在生成代理时,首先我不能告诉系统一次生成所有代理(比如“导入”数据库的行,并将每一行转换为具有特征的代理)。我试着在每个生产订单之间增加1s的差异,但是,当到达最后一个日期时,我的模拟给出了一个错误并

  • 本文向大家介绍MySQL如何创建触发器,包括了MySQL如何创建触发器的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了MySQL创建触发器的具体代码,供大家参考,具体内容如下 先来个实例: 实例解析:   先创建触发器中待存储的表t_attendance   DELIMITER $   意思是告诉mysql下文执行语句以“$”结束,如果没有这句,下面语句会出错,mysql无法判断哪句