web-dev-qa-db-ja.com

関数を呼び出すときにスキーマプレフィックス(dbo)が必須なのはなぜですか?

ユーザーがデフォルトのスキーマ(dbo)でマップされ、スキーマにプレフィックスを付けずに[dbo]の下のすべてのテーブルを選択できる場合。

デフォルトのスキーマの下にある場合、プレフィックスなしでストアドプロシージャを実行できます。

それでは、なぜ関数の前にスキーマを付ける必要があるのでしょうか。

ありがとう!

9
Rajesh Ranjan

では、なぜdboの下に作成された、プレフィックスなしの関数(スキーマ)を呼び出すことができるのでしょうか。

から DFに関するブックオンラインドキュメント

スカラー式が使用されている場合、スカラー値関数を呼び出すことができます。これには、計算列とCHECK制約定義が含まれます。スカラー値関数は、EXECUTEステートメントを使用して実行することもできます。 スカラー値関数は、少なくとも関数の2部構成の名前を使用して呼び出す必要があります。

したがって、これは基本的にSQL Server開発チームによって設定された制限であり、私はそれを非常に正しいと考えています。 (会話のために)どういうわけか許可されているとしても、スキーマ接頭辞を使用します。

追加しなくても機能する場合でも、常にスキーマ名の使用をサポートしています。これはベストプラクティスであり、どんなに冗長でも、すべての「優れた」開発者が使用します。

私が目にするもう1つの理由は、データベースエンジンがgetdate ()のようなシステム関数とユーザー定義関数を区別するために何かを必要とすることです。スキーマ名なしで関数を呼び出すことが許可されている場合、データベースエンジンはGetdateという名前のユーザー作成関数とシステムのGETDATE()関数をどのように区別しますか。

11
Shanky

もう1つの回答は、これは制限であり、理由ではないことを説明しています。

要件は常に真ではありません。スカラーUDFはEXEC- edでも、暗黙の解決を使用できます(

これは名前の衝突を避けるためだと思います。

スキーマなしで関数の参照が許可されている場合、2000または2005でたまたまcrypt_gen_randomと呼ばれる独自の関数を作成した人は、2008年に組み込み関数の名前になったため、新しいバージョンにアップグレードするときに問題が発生します。 。

組み込み関数はそのように呼び出すことができないため、execの使用にはあいまいさはありません。

10
Martin Smith