2012-05-02 8 views
1

ストアドプロシージャの数が非常に多いデータベースがあります。ストアドプロシージャレベルでトランザクションを開始していないストアドプロシージャの数があります。SQL Serverがストアドプロシージャ内にSQL文を格納する方法

今、これらのストアドプロシージャのトランザクションを自動化したいと思います。現在、PowerShellを使用しています。

しかし、たとえば条件

をコミット/問題は、私は、ストアドプロシージャの定義を取得することができますですが、私は、私はいくつかのトランザクションのロールバックを書くことができるように、ストアドプロシージャ内の個々のSQL文を取得することはできませんよ上記のトランザクションが失敗する@@errorcount <> 0 then rollback

これを達成する方法を教えてもらえますか、そうする方法はありますか?私は(ストアドプロシージャ内にある)SQL文を分割することができる場合、私は、ストアドプロシージャ

を操作するためのPowerShellでいくつかのログインを書くことができ、彼らがテキストとして保存されている事前

+2

これは本当に悪い考えです。私はこれをプログラムではしません。これらのステートメントを配置する適切な場所を決定できるロジックをコーディングすることは非常に困難です。さて、最も安全な賭けは、Visual Studioのクエリパーサエンジンに結びつけ、プロシージャコードを解析し、それを別々のステートメントに分割することです。 –

+0

また、データベースから保存されたprocコードをどのように抽出する必要がありますか?あなたはソースコード管理システムを使用していませんか? –

+0

多くのBEGIN TRAN-COMMIT TRANロジックをprocsに追加すると、より多くのブロッキングが発生し、コマンドタイムアウトやデッドロックが頻繁に発生する可能性があります。 COMMITがどこかに残されていれば、トランザクションは何らかの方法で(おそらく強制的に)閉じられ、実行された作業が破棄されて失われるまで、トランザクションは開いたままで決してコミットされません。あなたがプログラマチックに新しい「定型句」のCRUD手続きを作成していたら、それは一つのことですが、私は3番目(4番目)の投票に入れなければなりません。これはあなたのベストアイデアではありません。 –

答えて

0

感謝を助けてください体を検査したり、文を変更したりするには、parserが必要です。 Visual Studio(Microsoft.Data.Schema.ScriptDom.dllおよびMicrosoft.Data.Schema.ScriptDom.Sql.dll)でも使用されているパーサーを使用して、get somewhereを使用することができます。これはVisual Studioのインストールで利用でき、redistributedにすることができます。私は現在、特定のSQLスクリプトに「許可されていない」SQL文が含まれていないことを確認するためにそれらを使用しています(もちろん、自分自身のコンテキストでは許可されていません)。

@RobertLDavisのコメントに同意しましたが、これはおそらく自動的に行われない方が簡単ではないと思います。また、となり、それ以降はすべての変更を確認する必要があります。したがって、おそらく最初に手動で行うことができました。

関連する問題