シナリオ:アプリケーションデータベース(SQL Server 2012)には、ストアドプロシージャ(SP)のビジネスロジック全体が含まれています。 DBをクライアントに公開する必要があるたびに、不必要にSPがクライアントDBにコピーされます。
問題:すべてのビジネスロジックがクライアント側でコピーされ、独自の問題が発生します。
以前に試したソリューション:
暗号化を使用した手順Proc_Nameの作成
この方法では、暗号化されて保守不可能なSPコードになります。クライアント側で実行されているコードのバージョンを判断できないため、デバッグできません。バージョン管理を適用できません。さらに、クライアントは実行できません。暗号化されたSPは複製されないため、DB複製。
LinkedServerDB.SchemaName.Proc_NameのシノニムSchemaName.Proc_Nameを作成します
これにより、Remote_Linked_Server_DBにある実際のSPにアクセスする参照(シノニム)をClient_DBに作成できます。各SP呼び出しでは、データ全体がClient_DBからアクセスされ、Remote_Linked_Server_DBに送信され、そこで計算が行われ、結果が返送されます。これにより、パフォーマンスに深刻な問題が発生します。また、リモートリンクサーバー。
要件(編集済み):
記載されている要件に反映されていない、以前の試行が機能しなかった理由があるため、要件が完全であるとは思いません。試行されたソリューション#1で、コードをデバッグできる必要がある/コードがどのバージョンであるかを知っている必要があり、クライアントがコードを複製できる必要があると述べました。これらの2つの問題は現在の要件ですか?
それでもレプリケーションの必要性が必要な場合は、「コンパイル(保護)」するという要件と矛盾します。
クライアントのサーバーは、sa
に完全にアクセスできるものであるため、VIEW ANY DEFINITION
権限を拒否することは実行可能なアプローチではないと想定します。
試してみる1つのことは、ストアドプロシージャのT-SQLを取得し、それぞれを変更せずにCLRストアドプロシージャにカプセル化することです。 1つ以上の関連するストアドプロシージャをアセンブリに配置します。これについてのいくつかの考えは次のとおりです。
WITH PERMISSION_SET = SAFE
を使用する必要がありますCommandType.Text
でCommandTextが現在のT-SQLストアドプロシージャのコンテンツに設定された SqlCommand を作成します"context connection=true"
です)システムをSQL2014にアップグレードできる場合は、 ここ を参照して、ネイティブにコンパイルされたストアドプロシージャについて読んでください。これにより、コードが保護され、パフォーマンスが向上する可能性があります。
おそらく少し遅れますが、ビジネスロジックは可能な場合はアプリケーション層で実行する必要があります。これにより、すべてのロジックが1か所に保持され、Microsoft SQLServerを使用する場合に非常にコストがかかる可能性があるデータベースレベルでのCPUリソースの必要性が減少します。
データベースを顧客に渡す必要がある場合は常に、最初に最新のコピーをステージングDBとして復元します。そのステージングDBに対してこれを実行します。
select 'drop procedure ' + name + ';' from sys.objects where type = 'P';
SPが複数のスキーマに分散している場合は、sys.schemas
も関与する必要があります。上記の出力を取得し、ステージングDBに対して実行します。関数、トリガー、その他の実行可能ファイル、および任意のタイプのオブジェクトに対して同様のことを行うことができます。完了したら、ステージングDBをバックアップし、それをお客様に送信します。すべてを自動化できます。