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