TSQL:提交时触发

时间:2012-12-13 13:26:25

标签: sql sql-server tsql esb

我们有一个后台系统,通过MSDTC存储过程将发票信息插入SQL数据库,应用程序插入标题,然后是详细信息。

我在标头表上设置了一个CLR触发器,当插入记录时会触发该触发器。

我遇到的问题是触发器在COMMIT TRANSACTION之前触发,这意味着可能没有填充详细信息,这是被触发的进程所需要的。此外,如果系统触发ROLLBACK TRANSACTION,则触发器已经触发。

我知道触发器无法分配给COMMIT,但是想知道是否有人有任何其他想法。

我偶然发现了一个建议的oracle解决方案,你创建了一个更新ON COMMIT的Materlised View,并试图找到TSQL等价的索引视图,但没有运气实现它。

总结:
是否可以使用索引视图触发COMMIT TRANSACTION


CLR触发代码

将JMS消息发送到队列,由Sonic ESB处理。

[Microsoft.SqlServer.Server.SqlTrigger(Name = "InvoiceTrigger", Target = "Table", Event = "FOR INSERT")]
public static void InvoiceTrigger()
{
    //Declare Connection vairables
    string connectionURL, connectionDomain, connectionUser, connectionPassword, connectionQueue;
    //Constant
    connectionUser = "user";
    connectionPassword = "pass";
    connectionQueue = "Queue";
    //Local Environment
    connectionURL = "tcp://IP:2506";
    connectionDomain = "Domain1";

    //Create connection sonic domain
    SonicSend send = new SonicSend(connectionURL, connectionDomain, connectionUser, connectionPassword, connectionQueue);

    //Send Test message to pipe
    SqlCommand command;
    SqlTriggerContext triggContext = SqlContext.TriggerContext;
    SqlPipe pipe = SqlContext.Pipe;
    SqlDataReader reader;
    switch (triggContext.TriggerAction)
    {
        case TriggerAction.Insert:
            // Retrieve the connection that the trigger is using
            using (SqlConnection connection = new SqlConnection(@"context connection=true"))
            {
                connection.Open();
                command = new SqlCommand(@"SELECT LSH_LINKCODE, DOC_CODE, LSH_DOCNUM FROM INSERTED;", connection);
                reader = command.ExecuteReader();
                if (reader.HasRows)
                {
                    string xml;
                    char cr = (char)13;
                    int i = 0;
                    while (reader.Read())
                    {

                        xml = @"<Invoice action='insert'>";
                        xml += "<LinkCode>" + reader.GetString(0).ToString() + "</LinkCode>";
                        xml += "<DocumentCode>" + reader.GetString(1).ToString() + "</DocumentCode>";
                        xml += "<DocumentNumber>" + reader.GetString(2).ToString() + "</DocumentNumber>";
                        xml += @"</Invoice>";
                        i++;
                        send.testJMSsend(xml);

                    }

                }

                reader.Close();
            }
            break;
    }

}

2 个答案:

答案 0 :(得分:1)

在有用的评论之后,说明无法在触发器中使用提交。

我查看了由触发器启动的ESB进程,该进程现在使用传递的信息查询数据,这解决了我的问题,因为BEGIN TRANSACTION创建了对查询数据的锁定在COMMIT TRANSACTION之前不会返回结果,这意味着在查询返回数据之前该过程不会继续,因此将始终填充发票详细信息。

此外,如果有ROLLBACK TRANSACTION,则该过程会超出预期的错误。

答案 1 :(得分:0)

看到这篇文章,您可能不得不使用context_info,然后为这些记录触发触发器......

Is there a way to disable a SQL Server trigger for just a particular scope of execution?