今日始めたばかりのBIDSとSSISを使用しているときと同じように、私は環境に配慮しています。テーブルを作成し、Accessデータファイルからいくつかのデータをインポートしたかったのです。私はそれを機能させましたが、部分的な結果を削除し続ける必要があり、すべてをトランザクションでラップするのは良い考えだと思いました。私はMSDTCを実行していないので、手動トランザクションを使用するだけだと思いました。BEGINTRANSを含むExectuteT-SQLタスクを追加してみました。次に、COMMITTRANSを使用したものとROLLBACKTransを使用したものをさらに2つ追加しました。データフロータスクが失敗した場合はロールバックに進み、失敗した場合はコミットに進みました。コミットに到達したとき、それは常に開始トランザクションがないと言っていました。パッケージはこんな感じ。これはサポートされていますか?それを機能させるための魔法のプロパティの設定が欠けていますか?
2 に答える
これらのタスクはそれぞれ独立して実行されるため、begin/rollback/commit が機能しません。テーブル内のすべてのデータを削除するだけの場合は、データ フロー タスクが失敗したときにテーブルに対して TRUNCATE ステートメントを実行します。このようにロードするときは、通常、テーブルをクリアしてデータ フロー タスクをテストするたびに値を入力します。
OK、これがこれにアプローチする方法に関する私のアドバイスです。私は通常、本番環境にロードするデータ フローを実行する前に、ロールバックが不要になるようにデータを変換します。だから私はステージングテーブルにロードし、データをクリーンアップするか、不良レコードを削除するか、ロールバックを引き起こす可能性のあるものの存在を確認してから、何かを本番テーブルに置くことを検討します。ショーストッパーがある場合は、本番環境に入るずっと前に発生するはずです。不正な形式のレコードを見つけて処理するだけの場合は、ステージング テーブルを使用すると、問題のあるデータを例外テーブルなどに送信することができます。prod への最終的なデータ フローができたら、その時点ですべてが適切であることがわかります。何千回ものインポートを行っており、製品レベルでロールバックする必要はありません。
本当に製品レベルでロールバックしたい場合は、データフローを使用してステージング テーブルにデータを入力した後、実行 SQl タスクでインポートを実行できます。これは、明示的なトランザクションとロールバックするための try catch ブロックを含むストアド プロシージャです。エラーの場合。