1

わかりました、それで私はこの質問が尋ねられたことを知っています。そして、私が読んだものはすべて「まあ..動的DSLを使用してそれを行うことはできますが、それを行わないでください」というものでした。私の質問はその理由です。私はまだこれに慣れていないので、私は学んでいるので私に耐えてください、しかしこれが私がしていることです。ストアドプロシージャを使用して動的ビュー(一時テーブルではない)を作成したいのですが、ビューには開始日と終了日を設定するために使用する2つの日付があります。次のようになります。

create or replace view MyView as
SELECT
   A.COLUMN_A
   FUNCTION1(to_date('2/10/2011','MM/DD/YYYY') TOTAL1,
   FUNCTION2(to_date('2/15/2011','MM/DD/YYYY') TOTAL2
FROM TABLE_A A;

次に、このビューを使用して、Crystalでのレポートに必要なデータを生成します。問題は、これらの同じSQLステートメントを別の言語で使用し始めようとしていることです。(現在delphiを使用していますが、別の言語での作業についてです(ただし、他の言語が何であるかはわかりません))ストアドプロシージャでビューを作成する理由は、a)ビューが動的であり、ベースになっているためです。ユーザーが選択した日付範囲b)複数の言語でかなり大きなビューを表示する代わりに(日付範囲の選択が変更されるため、その場で作成する必要があります)、関数とパラメーターの1行に合格する必要があります。私が読んだことの多くは、動的SQLを使用してビューを作成するのは悪いことだと言っていますが、その場でユーザーのために特別に作成された動的ビューがすでにあることを知っています。誰かがそれに関する問題を見ていますか?私は、自分の髪の毛をすべて引っ張り出さずに自分自身を抜け出すことができないような道に自分自身を入れたくないので、尋ねています。

4

3 に答える 3

2

私はDelphiフロントエンドとSQLServerバックエンドを実行します。なぜビューを使用するのですか?私はいつも、非常にうまく機能する単純なSELECTを使用してSPを作成します。Crystal Reportが頻繁に使用される場合(通常はそうです)、SPが実行されるたびにクリアされ、再入力される永続的なテーブルを作成するだけです。短く、甘く、そしてシンプル。

于 2011-02-11T14:19:21.470 に答える
1

ビュー(または任意のデータベースオブジェクト)を動的に作成することは、実行時にコードを操作することに似ています。良い意味でも悪い意味でも強力です。

あなたが遭遇するかもしれないリスクと問題:

  • パフォーマンス:DDLステートメントはキャッシュの一部を無効にします。これはパフォーマンスに悪影響を及ぼします
  • 致命的なバグ:他のものがビュー(ストアドプロシージャ、他のビュー...)に依存している場合、何らかの理由でビューが壊れると壊れます。
  • スケーラビリティ:DDLには、そのオブジェクトに対する排他ロックが必要です。それを取得するのに時間がかかる可能性があり、それを保持している間、他のすべての人をブロックします。
  • スケーラビリティ:2人のユーザーが同時に異なる方法でビューを変更する必要がある場合はどうなりますか?
  • 保守性:オブジェクトがその場で変化したときに何が起こっているのかを理解するのが難しくなります
  • セキュリティ:誰かがこれらのオブジェクトを変更する権利を持っている必要があり、それは邪悪なことをするために悪用される可能性があります。

99.9%では、オブジェクトを動的に作成する必要はありません。0.1%でない場合は、オブジェクトを使用しないでください。

手元のタスクの説明を考えると、変数部分をバインド変数として使用してsqlステートメントを使用してみませんか?ここでビューの必要性はわかりません。

于 2011-02-11T14:31:43.580 に答える
1

ビューを生成することは、それが本当にコード生成であり、一般的にかなり永続的である場合にのみ良い考えです。これはスキーマの変更であるため、高度な手法と見なす必要があります。私は常に、複雑な順にデータベース手法を使用するようにしています。

つまり、特定のテーブル/ビューのデザインで、ビューを使用して実行できる場合は、それを試してください。パフォーマンスのためにインデックス付きビューが本当に必要な場合は、それを試してください。または、計算列または永続化された計算列の場合もあります。おそらく、インラインのテーブル値関数、マルチステートメントのテーブル値関数、または場合によってはストアドプロシージャです。そのため、必要な場合にのみエスカレーションするようにしています。

あなたの場合、その「ビュー」はSQL Server(および少なくともDB2)のインラインテーブル値関数にすることもでき、そのようなクリーチャーはパラメーター化されたビューのようなものです。また、ほとんどのレポートツールから(そしてもちろんほとんどの言語/ dbライブラリから)パラメータ化されたストアドプロシージャを直接使用することもできます。

于 2011-02-11T14:40:33.723 に答える