4

MSDTCストアドプロシージャを介して請求書情報をSQLデータベースに挿入し、アプリケーションがヘッダーを挿入し、次に詳細情報を挿入するバックオフィスシステムがあります。

レコードが挿入されたときに起動するCLRトリガーをヘッダーテーブルに設定しました。

私が抱えている問題は、トリガーがトリガーCOMMIT TRANSACTIONされるプロセスで必要とされる詳細情報が入力されない可能性があるという意味の前にトリガーが起動していることです。また、システムが起動した場合ROLLBACK TRANSACTION、トリガーはすでに起動しています。

トリガーをに割り当てることはできないことは理解していますがCOMMIT、他に何か考えがあるかどうか疑問に思っていました。

更新するMaterlisedViewを作成する、Oracleの推奨ソリューションに出くわし、ON COMMITインデックス付きビューであるTSQLに相当するものを見つけようとしましたが、実装できませんでした。

要約すると、インデックス付きビューを使用している可能性が
ある場合にトリガーすることは可能ですか?COMMIT TRANSACTION


CLRトリガーコード

Sonic ESBによって処理されるように、JMSメッセージをキューに送信します。

[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;
    }

}
4

2 に答える 2

1

トリガーでコミットを利用することは不可能であると述べた有益なコメントの後。

トリガーによって開始されたESBプロセスを確認しました。プロセスは、渡された情報を使用してデータをクエリします。これによりBEGIN TRANSACTION、データにロックが作成され、クエリが結果を返すまで結果が返されないため、問題が修正されました。COMMIT TRANSACTIONつまり、クエリがデータを返すまでプロセスは続行されないため、請求書の詳細は常に入力されます。

また、があったROLLBACK TRANSACTION場合、プロセスは期待どおりにエラーをスローしてタイムアウトします。

于 2012-12-14T16:07:39.880 に答える
0

この記事を参照してください。おそらくcontext_infoを使用して、後でそれらのレコードに対してトリガーを起動する必要があります...

特定の実行範囲でSQLServerトリガーを無効にする方法はありますか?

于 2012-12-13T13:39:35.673 に答える