2016-06-21 12 views
0

SSISパッケージは、読み込み前にRefresh Exchange Ratesと呼ばれるパッケージを呼び出しています。これは、他のパッケージが更新されているためです。同じコードを複数回実行すると、プライマリキーの制約エラーが発生する

Exchangeレートテーブルには、重複エントリを防ぐための主キー制約があります。場合によっては、複数のパッケージが同じコードを呼び出しているため、Refresh Exchange Ratesパッケージが複数回同時に実行されることがあります。次のコードは実行されますが、複数回実行すると主キー制約が生成されます。

TRUNCATE TABLE dbo.FactExchangeRate 
INSERT INTO dbo.FactExchangeRate (
    FromCurrencyId, 
    ToCurrencyId, 
    RateDate, 
    ExchangeRate 
) 
SELECT 
    FromDimCurrency.Id AS FromCurrencyId, 
    ToDimCurrency.Id AS ToCurrencyId, 
    CAST(AXCURD.DT AS DATE) AS RateDate, 
    AXCURD.EXRATE AS ExchangeRate 
FROM 
    DataWarehouseRawData.dbo.AXCURD 
INNER JOIN 
    dbo.DimCurrency FromDimCurrency ON 
    FromDimCurrency.SourceKey = AXCURD.FRAXCURIDX 
INNER JOIN 
    dbo.DimCurrency ToDimCurrency ON 
    ToDimCurrency.SourceKey = AXCURD.TOAXCURIDX 

これを防ぐにはどうすればよいですか? コードが複数回(この例では3回)実行されていることを知っていますので、これはトランザクションなどと関係があると思います。TABLOCKXを挿入してみましたが、 TRUNCATEからDELETE(取引の場合)、またBEGIN TRANSACTIONなどを試しましたが、最終的にデッドロックが発生しました。

+0

ではなくTRUNCATE/INSERTパターンパターンまたはMERGEコマンドをDELETE/INSERT/UPDATEを使用します。一般的に、これは、データウェアハウスで、特に切り捨て/挿入よりも良いアイデアです。たとえば、現在のところ、ロード・プロセスに失敗するため、データ・ウェアハウスに外部キーを作成できない可能性があります。詳細を知りたい場合 –

+0

ほとんどの次元がマージされていますが、これは簡単なプロセスで切り詰めてリロードするという事実の1つです。私たちは故意に外来キーを持っていません。なぜマージが私の問題に役立つのか説明できますか?マージは本当にdml操作の文法的な砂糖ではありませんか? – Lock

+0

マージでは、すでに存在するレコードは理論上挿入されませんが、複数のセッションがあるので、あまりよく分かりません。個人的には、MERGEへのINSERT/UPDATE/DELETE文を別々にする方が好きです。なぜなら、明らかにいくつかのバグ(これは修正されるかもしれません)があるからです。より根本的な解決策は、スナップショットアイソレーションを有効にしてからトランザクションを使用することです。これは、テーブルがトランザクション内でロックされている間は、ロックされずに以前存在していたテーブルのバージョンを使用します。 –

答えて

0

パッケージが互いの上で実行されないようにタイミングを調整する必要があるように思えます。これらのパッケージは、1つのSQL Serverジョブの下に構成されていますか、または複数のジョブがありますか?後者の場合は、ジョブを5〜10分間隔でスケジュールして、各ジョブの完了までに時間をかけてください。すべてのパッケージが1つのジョブの下にある場合は、パッケージを別々のジョブステップに分割し、ステップが順番に実行されるようにします。

+0

これは問題の解決策ではありません!あなたは、週に1回、日曜日の朝、誰もシステムにいないときにそれを実行するといいかもしれません... – BIDeveloper

+1

@ BIDeveloper:Stunshawの答えが解決策になるかもしれません。私たちは以前と同じ事件を経験しました。私たちのSQLサーバは常にデッドロックを起こしていました。その理由は、仕事がすべて同時に始まったからです。 btw:あなたが決して問題を抱えていないのでドットを結びつけられないので、他人を嘲笑しないでください。あなたはただ自分を嘲笑しているだけです – Johannes

関連する問題