【问题标题】:SQL Trigger insertSQL 触发器插入
【发布时间】:2011-03-06 19:40:16
【问题描述】:

设置触发器以获取表中的所有新行并将它们插入工作队列表的最佳方法是什么。

非常感谢 Sp

【问题讨论】:

  • 您使用什么 RDBMS 和版本?触发器语法各不相同。您最好只跟踪最近处理的 ID 或为此添加一个日期时间列?
  • 对不起,这是一个 sql server 2000 数据库

标签: sql sql-server-2000 triggers


【解决方案1】:

使用此触发器:

CREATE TRIGGER InsertIntoWorkingTable
    ON VeryOldHugeDatabaseTable
    INSTEAD OF INSERT 
AS
    insert into WorkingTable (column1, column2, column3...) (
        select column1, column2, column3
            from inserted
    )

您所要做的就是继续插入您的VeryOldHugeDatabaseTable。触发器将忙于插入此工作表。

有时,您可以简单地通过作业或类似的方式启动存储过程,以便从工作表插入或归档到这个旧表中。

【讨论】:

  • 我从他的“工作队列”评论中得到印象,他正在插入主表并将 FK 作为附加到行的某种操作项放在单独的表中。
  • 我们有一个旧的数据库表,最初是在 access 中构建的(它是一场噩梦),它目前有 80 列宽和 1.5m 行。它仍然被用来使用复杂的存储过程为下一个客户提供服务,正如您可以想象的那样,它的运行速度非常慢。我试图将所有新行转移到另一个表(7 列,并且永远只有 100-200 行),一旦他们工作不好归档它们,这样前端用户将看到速度的显着提高.. Ps 前面最终应用程序仍在并访问数据库
  • @Steven。如果您有某种方法可以将有用记录与高度选择性的无用记录区分开来,您应该能够将其添加到查询中(或使用此标准创建视图,而不是实际复制行)。给定适当的索引和统计信息,查询优化器应该能够识别这一点并尽早执行过滤。
【解决方案2】:

搜索“t-sql trigger”会返回第一个结果:

Create Trigger

除了语法之外,您几乎回答了自己的问题。在插入后设置一个触发器,并在其中放入一个插入语句。

【讨论】:

    【解决方案3】:

    回答你提出的问题

    CREATE TRIGGER dbo.tr_i_BaseTable 
       ON  dbo.BaseTable 
       AFTER INSERT
    AS 
    BEGIN
        SET NOCOUNT ON;
    
       INSERT INTO WorkTable
       SELECT * FROM INSERTED
    
    END
    

    但是,您可以不使用行的其他属性来检测应该被视为工作表一部分的“新”行,而不是实际复制行两次。例如 ID 或添加“插入”的日期/时间字段。

    或者另一种方法可能是重新开始使用新的 WorkTable 并考虑归档所有以前的记录。您可以创建一个(可能是分区的)视图UNION ALL-为需要在合并集上工作的那些查询创建 2 个表。

    【讨论】:

    • 我了解您的评论来自哪里。数据库表一团糟,运行缓慢,因此我想单独保存“工作队列”数据。感谢您的代码,您所做的与我的设想相似。再次感谢 Sp 非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多