SSISパッケージの処理失敗時にRollbackさせる方法

このQ&Aのポイント
  • SQL Server2005 のSSISにて、SSISパッケージ処理が失敗した場合に、Rollbackする方法を教えてください。
  • 質問者はSSISパッケージを使用していて、パッケージ1が成功し、パッケージ2が失敗した場合に、パッケージ1の内容がRollbackされない状況で困っています。
  • 質問者が作成した処理にはシーケンスコンテナがあり、パッケージ1とパッケージ2はシーケンスコンテナ内で実行されています。どなたか、この問題に対する解決方法を教えていただけませんか?
回答を見る
  • ベストアンサー

SSISパッケージの処理失敗時にRollbackさせる方法がわかりません

SQL Server2005 のSSISにて、 以下のような処理を作成し、 SSISパッケージ1は成功、SSISパッケージ2が失敗と なった場合に、SSISパッケージ1の内容が Rollback されないのですが、 これをRollbackする方法はあるのでしょうか?? ┏━━━━━━━━┓ ┃Begin Transaction ┃ ┗━━━━┳━━━┛         ↓ ┏━━━━┻━━━━━━━┓←シーケンスコンテナ ┃┏━━━━━━━━━━┓┃ ┃┃SSISパッケージ1(dtsx) ┃┃ ┃┗━━━━┳━━━━━┛┃ ┃        ↓         ┃ ┃┏━━━━━━━━━━┓┃ ┃┃SSISパッケージ2(dtsx) ┃┃ ┃┗━━━━━━━━━━┛┃ ┗━━━━┳━━━━━━━┛         ↓ ┏━━━━┻━━━━━┓←失敗時 ┃Rollback Transaction  ┃ ┗━━━━━━━━━━┛ なお、SSISパッケージ1、2共に、 処理内容はシーケンスコンテナ内に入れています。 【SSISパッケージ1、2のイメージ】 ┏━━━━━┓←シーケンスコンテナ ┃┏━━━┓┃ ┃┃処理1 ┃┃ ┃┗━┳━┛┃ ┃   ↓   ┃ ┃┏━━━┓┃ ┃┃処理2 ┃┃ ┃┗━━━┛┃ ┗━━━━━┛ (元々単体でトランザクションを張っていたため、 シーケンスコンテナ内に入れている) どなたかご教授頂けると幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

基本的にセッションのコントロールはパッケージ単位であるため、パッケージ間でトランザクションを継承させるには、DTCによるコントロールを使うしかないと思います。 今回のケースで子パッケージに親パッケージと同一のセッションを使用するように強制する方法はありません。

junzo_ex
質問者

お礼

jamshid6 さま ご回答ありがとうございます。 やはり、分散トランザクションを使うしか無さそうですか。。 >今回のケースで子パッケージに親パッケージと同一のセッションを使用するように強制する方法はありません。 了解です。ありがとうございました!

関連するQ&A

  • SSISパッケージ保存について

    こんにちは。 SSISパッケージについて質問させていただけないでしょうか? 現在SQL Server2005 Standard Editionを使用しています。 SQL Server Management Studioを使用しているクライアント側のPC、 DBサーバーとしているサーバー側PCどちらにも2005 Standardを入れています。  Accessのmdbのテーブルをインポートしようとしており、インポートのみなら成功するのですが、SSISパッケージの保存を選択し、サーバー側のDBを指定したところ、「インターフェイスがサポートされていません」、SQL Serverに保存できませんでした”と表示されます。 SSISパッケージの保存を行うには事前に保存するサーバー側に何か設定を行っておく必要があるのでしょうか?

  • トランザクション処理について教えてください

    お世話になります まず、トランザクション処理の定義から 「関連する複数の処理を一つの処理単位としてまとめたもの。」 例えば 金融機関での入出金処理、入金処理は成功で、出金処理は失敗 となると、まずいことになります。それで、 この、トランザクション処理は 「すべて成功」か「すべて失敗」のいずれかであること が保証されることらしいのですが、 さて、これを実現する方法を教えてください。 ACCESSのVBを使っての話で、エクセルファイルの作成や更新も あります。 また、どういった所を調べればいいかのアドバイスだけでもありがたいです 何か Begin Transaction ~ End Transaction のような方法を取ると聞いたことがあるのですが。

  • SSIS(SP1)で発生するエラーについて。

    皆様、お世話になります。 まず、初めに環境を晒します。 ・OS WindowsServer2003 SP1 ・DB SQLServer2005 SP1 SSISを使用しフラットファイルをDBに収めるという処理を行っております。 そのSSISの中で緩やかなディメンションを使用し追加更新を行っておりますがエラーが発生します。(検証エラー) 以下が、検証エラー内容です。 [挿入先 [1840]] エラー : OLE DB エラーが発生しました。エラー コード: 0x80040E37。 OLE DB レコードを使用できます。ソース: "Microsoft SQL Native Client" Hresult: 0x80040E37 説明: "分散トランザクションが完了しました。このセッションを新規トランザクションまたは NULL トランザクションのいずれかに参加させます。"。 マイコン-管理にて分散トランザクションの設定は行っております。 といってもサービス起動の確認をしただけですが・・・ 以上の処理をSQLServer2005 "SP2"で動かしたところ正常に動作します。 SP1で使えないということはバグと認識したいのですが確かなソースが ありません。SP1でもSSISを実装できるってことはバグとも考えにくいし混乱している状態です。 この情報に関する事を知っている方、是非よろしくお願い致します。

  • insert1つの処理でもトランザクションは必要?

    お世話になります。 現在、MYSQLデータベースを使用したプログラムを書いており、 そこでトランザクションについて質問があります。 トランザクションとは、複数の処理がすべて成功した場合に正式な処理を実行(commit)、1つでも失敗した場合は元に戻す(rollback)というようなことかと思うのですが、 では、1つの処理のみの場合は、トランザクションを使用する必要はないのでしょうか? 例えば、 ・あるテーブルにデータをinsertしたい。 このような単一の処理を書く場合でも、 以下のようにトランザクションを使うべきでしょうか? $dsn = 'mysql:dbname=〇〇〇;host=〇〇〇;charset=utf8'; $user = 'user'; $pwd = 'pwd'; //DB接続 try { $pdo = new PDO($dsn, $user, $pwd); } catch (PDOException $e) { die('DB接続失敗'); } //トランザクション開始 $pdo->beginTransaction(); //INSERT try { $sql = 'INSERT into table (test1, test2, test3) VALUES (:a, :b, :c)'; $st= $pdo->prepare($sql); $ret = $st->execute(array( ':a' => $a, ':b' => $b, ':c' => $c, )); if (!$ret) { throw new Exception('INSERT 失敗'); } //commit $pdo->commit(); } catch (PDOException $e) { //rollback $pdo->rollBack(); } $pdo = null; ※前提として、テーブルを使用するユーザーは多数います。 ご存知の方、ご回答いただけるれば幸いです。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • select into句のトランザクションについて

    お世話になってます。 sqlについて質問です。 ddlを発行するとトランザクションは暗黙的にコミットされると思いますが、 select into #temptable ・・・ のように、select into 句で一時テーブルを作成した場合、トランザクションはどうなるのでしょうか? また、以下のように一時テーブルと普通のテーブルで挙動は変わりますか? begin transaction select into #temptable from A ← ここでコミットされてしまう? …(1) select into temptable from A ← ここでコミットされてしまう? …(2) rollback transaction 以上、よろしくお願いいたします。

  • SSISのトランザクションの設定がうまく出来ない

    パッケージ全体が成功すると パッケージ全体をコミットさせる、といった事をしたいのですが、 どうしてもうまく動作してくれません。。 ちなみに、以下の設定を実施しました。 ・パッケージ全体の[TransactionOption]を[Required] ・各タスクの[TransactionOption]を[Supported] ・パッケージ全体の[ProtectionLevel]を[DontSaveSensitive] #もちろん、[TransactionOption]を全て[Supported]にすると、 #問題無く動作します。 以下、エラーメッセージを纏めたものです。 -------------------------------------------------- 開始: XX:XX:XX エラー: 2008-08-XX XX:XX:XX コード: 0xC001A004 説明: 保持されている接続で互換性のないトランザクション コンテキストが指定されました。 この接続は別のトランザクション コンテキストで確立されています。 保持されている接続は 1 つのトランザクション コンテキストのみで使用できます。 エラー終了 -------------------------------------------------- エラー: エラー: 2008-08-XX XX:XX:XX コード: 0xC020801C ソース: フラットファイルよりTestTableへインポート OLE DB 変換先:TestTable [283] 説明: SSIS エラー コード DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER。 エラー コード 0xC001A004 により、接続マネージャ "TestDB" に対する AcquireConnection メソッドの呼び出しが失敗しました。 このエラーの前に、AcquireConnection メソッドの呼び出しが失敗した理由の詳細が記載された エラー メッセージが報告されている可能性があります。 エラー終了 -------------------------------------------------- エラー: 2008-08-XX XX:XX:XX コード: 0xC0047017 ソース: フラットファイルよりTestTableへインポート DTS.Pipeline 説明: コンポーネント "OLE DB 変換先:TestTable" (283) が検証に失敗し、 エラー コード 0xC020801C が返されました。 エラー終了 -------------------------------------------------- このエラーが発生した際に、 「分散トランザクションを中止しています。」と、 パッケージの進行状況に表示されていることから、 分散トランザクション自体は動作しているように見えます。 以上より、 どなたか解決方法をご存知の方、ご教授頂けると幸いです!

  • トランザクションについて

    トランザクションについての質問なのですが、下にある1のSQLを実行すると 'a'だけ登録されるのは、分かるのですが、 2のSQLを実行すると、'c'と'd'の両方が登録されてしまいます。 私的には、両方登録されないのかなぁと思っていたのですが・・・ COMMITが来た時点で、START TRANSACTIONの開始位置は、 あまり関係ないということなのでしょうか? よろしくお願いします。 1. START TRANSACTION; insert into test values('a'); START TRANSACTION; insert into mtuser values('b'); ROLLBACK; COMMIT; 2. START TRANSACTION; insert into test values('c'); START TRANSACTION; insert into mtuser values('d'); COMMIT; ROLLBACK; 環境:Mysql4.1.19

    • ベストアンサー
    • MySQL
  • バッチでのSQL実行結果の分岐処理について。

    バッチでのSQL実行結果の分岐処理について。 お世話になっております。 バッチからsqlを実行してその結果によってそれ以降のバッチ全体の処理を停止させる方法を考えています。 手がかりがつかめずまったく先に進めないためアドバイスをいただけますでしょうか。 バッチの内容(start_del.bat) -------------------------------------------------------- osql -i.\del.sql -o c:\wk\log.txt -S gold -E osql -i.\create.sql -o c:\wk\log.txt -S gold -E ------------------------------------------------------------ SQLの内容(del.sql) ------------------------------------------------------------ BEGIN TRANSACTION; DELETE FROM LDDB.dbo.test WHERE b='0'; IF @@ERROR = 0 <--エラー判定にこのコマンドを使おうと考えました BEGIN *********************** END ELSE BEGIN ********************** END COMMIT TRANSACTION; ------------------------------------------------------------ 処理の概要: 1.バッチで最初にdel.sqlを実行します。 2.del.sqlの実行が失敗すれば、2つ目のバッチであるcreate.sqlは実行ささずに、バッチを終了させます。 *ポイントはdel.sqlの結果というのは、バッチからdel.sqlを実行できたかではなく、del.sqlの実行結果を判断するという点です。 教えていただきたいこと ・del.sqlの実行後、制御がバッチに戻ったときに、結果を確認してバッチを継続させるか終了させるかを判断させる方法はどのような仕組みを作ればいいのでしょうか。 Windows2003サーバーで、SQLServerは2005です。 初心者のためよく分かっていないことが多すぎで申し訳ありませんが、アドバイスをいただけますでしょうか。 よろしくお願いいたします。

  • SSISにて、一時テーブルを使ったファイルの取り込みがうまく行かない場合がある

    SQL Server2005 の SSISにて、一時テーブルを作成し、 その一時テーブルにフラットファイルを読み込む、 といった処理を行っています。 こちらの処理について、 SSIS インポート及びエクスポートウィザードで 作成した処理であれば問題なく動作するのですが、 手動で作成した処理だと、ウィザードで生成された パッケージと同じように設定しても、 検証の段階で 「##tblのfistload行セットが開けませんでした」 といったエラーメッセージが表示されてしまい、 実行そのものが出来ない状態にあります。 なぜ、ウィザードだと出来て、手動だと出来ないのか。。 プロパティ系の設定はひととおり抑えたつもりです。 どなたか同じ現象を体験した方、 また、解決方法をご存知の方がいらっしゃいましたら 何卒ご教授くださいませ。

  • SSIS 変数の値をSQL実行タスクSQLStatementで利用する方法

    初めまして! SSISの変数利用について 教えて頂きたいので よろしくお願いいたします。 SSISの変数に入った値をSQL実行タスクの SQLStatementで利用することは できませんでしょうか? 具体的に何をやりたいかと言いますと データを取り込む為に一時テーブルを使います。 SQL実行タスクで一時テーブルを作成して、 データを取り込み、処理後に一時テーブルを削除します。 素人考えで、もしほぼ同時にパッケージが実行された場合に 一時テーブルの名前がカブっていると不具合の元にならないかと思いました。 そこで、変数の値でテーブル名を動的につけられればと思ったのですが、 変数に入れた値を、 色々調べてみたのですが SQL実行タスクエディタのSQLStatementでどう呼び出せばよいのか分かりません。 例えば、以下のような文で##test_table の部分を変数で指定することはできないのでしょうか? CREATE TABLE ##test_table( [CD] VARCHAR(10), [NAME] VARCHAR(20) ) GO お手数ですが、ぜひ教えてください。 SSISを始めたばかりで 考え方自体がおかしいのかも知れません・・・。 その場合は本当に申し訳ありません どうぞよろしくお願いいたします!