none
メール送信ステータスのsysmail_faileditemsについて RRS feed

  • 質問

  • ストアドより『dbo.send_mail』を使用してメール送信を実施しています。

    そこで皆様に2つ御相談させて頂きたく。

    ①メール送信処理を実施後、失敗した場合はリトライしたいと考えています。

    そこで、存在しない宛先やファイルを引数に指定した場合、送信エラーとして取得出来ますが、送信失敗テーブルである【sysmail_faileditems】には登録されません。いったいどのような失敗をした場合、登録されるのでしょうか?

    ②メール送信トリガについて

    メールを送信する必要がある場合、アプリ側でメイン、宛先、添付の3テーブルに登録しようかと考えています。メインメールテーブル(本文や表題等)に自動採番機能を付けてそれをキーにして残り2つのテーブルと整合性をとろうかと考えています。

    トリガはメインテーブルへインサート処理と考えています。

    そこでご質問ですが、メインテーブルを登録して初めて自動採番のキーが取得出来るので、宛先テーブルや添付ファイルテーブルを登録する前にトリガが走ってしまいます。しかし、ファイルは添付するとは限らないし、宛先テーブルには1対Nの関係を考えると他のテーブルをトリガには出来ないと考えているのですが、皆様であればどのような構成で実施されているのでしょうか?

    以上、2点につきまして何卒宜しくお願い申し上げます。

    2014年6月13日 7:35

回答

  • >sysmail_faileditems に登録される条件
    sysmail_allitems.sent_status が failed であることです。
    SMTP サーバーに接続できない場合などは failed になったかと思います。

    >複数テーブル間でのシーケンスの共有
    やり方は山ほどあるので好き好きですが、トリガを使わず、トランザクションをかけて、メインテーブルにて IDENTITY で採番し、他テーブルへはその採番した値を INSERT するとか。
    採番した値は OUTPUT 句で取り出すのが個人的には好みですが、SCOPE_IDENTITY とかもありですね。
    ストアドにしたり、トリガにしたり、シーケンスが使えるバージョンならシーケンスを使ったり、手法は様々ですので、制約条件(複数テーブル更新時はトリガとしなければいけない、とか)が無いと答えが付きにくいかと思います。
    あと、バージョンによって機能が違いますので、機能を選ぶところから質問に含む場合はバージョンを付記すべきです。

    で、そもそもこの場合は sysmail_faileditems に入る条件を満たしているかどうかを判断するべきでしょう。
    sysmail_allitems で append_query_error や sent_status、sent_date がどうなっているか確認することをお勧めします。


    MCITP(Database Developer/Database Administrator)

    • 回答としてマーク kong0214 2014年6月16日 0:29
    2014年6月14日 14:30
  • >上記は3テーブルの整合をとるには同様の考えをもっていますが、どのようなきっかけでメール送信処理を飛ばすと仕組みなのでしょうか?
    私でしたら、DB とメールサーバーが通信できないこともあるので、メインテーブル他へ INSERT をするプログラム側にメール送信処理を入れますね。
    というか、DB は必要のあるサーバーとだけ繋がっているクローズドな LAN 側に置こうとしますし、あるいはパフォーマンス上のボトルネックになりやすいという観点から、データを管理する以外の仕事はさせないように組みます。

    >上記以外でsysmail_faileditems テーブルに登録されるにはどうすれば宜しいでしょうか?

    これはそういう仕様なので、そういうものとして使うしかないかと。


    MCITP(Database Developer/Database Administrator)


    2014年6月16日 14:28

すべての返信

  • >sysmail_faileditems に登録される条件
    sysmail_allitems.sent_status が failed であることです。
    SMTP サーバーに接続できない場合などは failed になったかと思います。

    >複数テーブル間でのシーケンスの共有
    やり方は山ほどあるので好き好きですが、トリガを使わず、トランザクションをかけて、メインテーブルにて IDENTITY で採番し、他テーブルへはその採番した値を INSERT するとか。
    採番した値は OUTPUT 句で取り出すのが個人的には好みですが、SCOPE_IDENTITY とかもありですね。
    ストアドにしたり、トリガにしたり、シーケンスが使えるバージョンならシーケンスを使ったり、手法は様々ですので、制約条件(複数テーブル更新時はトリガとしなければいけない、とか)が無いと答えが付きにくいかと思います。
    あと、バージョンによって機能が違いますので、機能を選ぶところから質問に含む場合はバージョンを付記すべきです。

    で、そもそもこの場合は sysmail_faileditems に入る条件を満たしているかどうかを判断するべきでしょう。
    sysmail_allitems で append_query_error や sent_status、sent_date がどうなっているか確認することをお勧めします。


    MCITP(Database Developer/Database Administrator)

    • 回答としてマーク kong0214 2014年6月16日 0:29
    2014年6月14日 14:30
  • OS = WinServer2008R2

    制約条件はありませんが、現在考えているのがメール用として、メイン、宛先、添付の3テーブルです。

    要件としては、連絡が即必要なのでアプリ側からメールメインテーブルへの登録をトリガとしてメール発信条件と考えました。

    クライアントに負担をかけない為にストアドが条件と言われておりまして、メールを即送信する為にはトリガ以外判らなかったのでトリガでメール発信としております。

    整合を取るにはメインテーブルIDENTITYにてメインを採番し、宛先、添付も採番した値で登録・・・と考えました

    具体的にはアプリでメイン登録⇒アプリでメインへ登録した採番を取得⇒宛先、添付テーブルに取得した採番をキーにテーブルへ登録と考えたのですが、これだと宛先、添付へ登録する前にトリガが走ってしまいます。また、宛先テーブルをトリガにしますとTo、CC等ありますからメイン1レコードに対して、宛先や添付は複数件登録がありますので、こちらもトリガとしては適当でないと考えております。

    >やり方は山ほどあるので好き好きですが、トリガを使わず、トランザクションをかけて、メインテーブルにて IDENTITY で採番し、他テー>ブルへはその採番した値を INSERT するとか。

    上記は3テーブルの整合をとるには同様の考えをもっていますが、どのようなきっかけでメール送信処理を飛ばすと仕組みなのでしょうか?

    >で、そもそもこの場合は sysmail_faileditems に入る条件を満たしているかどうかを判断するべきでしょう

    存在しない宛先の場合、メールサーバから宛先が存在しません、と返ってきてしまいます。

    存在しない添付ファイルやToを空にして送信しようとした場合は、ストアド側のエラーチェックで捕まえていますが、

    上記以外でsysmail_faileditems テーブルに登録されるにはどうすれば宜しいでしょうか?

    >sysmail_allitems で append_query_error や sent_status、sent_date がどうなっているか確認することをお勧めします

    ステータスがsentのみなので、普通どれも変化はありません。

    以上、何卒宜しくお願い申し上げます。

    2014年6月16日 1:16
  • >上記は3テーブルの整合をとるには同様の考えをもっていますが、どのようなきっかけでメール送信処理を飛ばすと仕組みなのでしょうか?
    私でしたら、DB とメールサーバーが通信できないこともあるので、メインテーブル他へ INSERT をするプログラム側にメール送信処理を入れますね。
    というか、DB は必要のあるサーバーとだけ繋がっているクローズドな LAN 側に置こうとしますし、あるいはパフォーマンス上のボトルネックになりやすいという観点から、データを管理する以外の仕事はさせないように組みます。

    >上記以外でsysmail_faileditems テーブルに登録されるにはどうすれば宜しいでしょうか?

    これはそういう仕様なので、そういうものとして使うしかないかと。


    MCITP(Database Developer/Database Administrator)


    2014年6月16日 14:28