【问题标题】:After insert trigger - SQL Server 2008插入触发器后 - SQL Server 2008
【发布时间】:2010-01-12 17:07:05
【问题描述】:

我有来自 datastage 的数据,这些数据被放入我们的 SQL Server 2008 数据库中的表中:stg_table_outside_data。我们的来源每天早上都将数据放入该表中。我想将数据从stg_table_outside_data 移动到table_outside_data,在那里我保留了多天的数据。

我创建了一个存储过程,将stg_table_outside_Data 中的数据插入table_outside_data,然后截断stg_table_outside_Data。外部的 datastage 进程不在我的控制范围内,所以我必须在 SQL Server 2008 中完成这一切。我原本计划使用一个简单的 after insert 语句,但 datastage 在每 100,000 行之后执行一次提交。触发器将在第一次提交后运行,并导致数据阶段进程出现死锁错误。

有没有办法设置插入后等待 30 分钟,然后确保在该时间范围内没有新的提交?我的问题有更好的解决方案吗?目标是将数据从暂存表中取出并进入工作表而不重复,然后截断暂存表以供第二天早上的负载使用。

感谢您的宝贵时间和帮助。

【问题讨论】:

    标签: sql-server sql-server-2008 triggers datastage


    【解决方案1】:

    您可以做到这一点的一种方法是利用 SQL Server 2008 中的新 MERGE 语句(请参阅 MSDN docsthis blog post)并将其安排为每 30 分钟左右的 SQL 作业。

    MERGE 语句允许您轻松定义操作(INSERT、UPDATE、DELETE 或根本不执行任何操作),具体取决于源数据(您的临时表)和目标数据(您的“真实”表)是否在某些方面匹配标准,或者没有。

    所以在你的情况下,它会是这样的:

    MERGE table_outside_data AS target
    USING stg_table_outside_data AS source 
    ON (target.ProductID = source.ProductID)   -- whatever join makes sense for you
    
    WHEN NOT MATCHED THEN
        INSERT VALUES(.......)
    
    WHEN MATCHED THEN 
        -- do nothing
    

    【讨论】:

      【解决方案2】:

      您不应该使用触发器来执行此操作,而应该使用计划作业。

      【讨论】:

      • 我希望可以。我们公司不会让我们安排预定的工作。我们必须让 DBA 参与进来,而项目计划让我们有 3 个月的时间。我们在等待名单上,但我希望能找到一个临时解决方案。
      • 找一个dba来安排工作需要3个月?五分钟或更短的任务?真的吗?然而他们让你弄乱触发器?多么奇怪。
      • 我们不允许安排作业,因为它们无法阻止我们安排作业以从公司内的其他数据库中获取数据。但是,我们可以设置触发器,因为它是在我们自己的数据库中构建和包含的。
      【解决方案3】:

      也许构建一个程序,每天一次将所有数据从 stg_table_outside_Data 移动到 table_outside_data,或者使用作业调度程序。

      【讨论】:

        【解决方案4】:

        对触发器进行行计数,如果计数小于 100,000,则不执行任何操作。否则,运行您的进程。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-10-19
          • 1970-01-01
          • 1970-01-01
          • 2015-01-31
          • 1970-01-01
          • 2013-11-09
          相关资源
          最近更新 更多