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


9

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

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

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

ありがとう!

回答:


11

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

UDFのBooks Onlineドキュメントから

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

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

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

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


次に、SPとはなぜ異なるのか。あなたが言ったように、名前の衝突を避けるためかもしれません。ユーザーデータベースにSP "create procedure sp_help as select getdate()"を作成しました。スキーマ(dbo)ありまたはなしで実行すると、SQL ServerはシステムSPを参照します。作成したSPが実行されないのはなぜですか。
Rajesh Ranjan

1
@rajeshRajan sp_procname(SPでプロシージャのプレフィックスを付けた)があるため、SQL Serverはコンパイルされたプランのマスターデータベースを最初に調べ、このプロシージャがマスターデータベースに存在するため、プロシージャを見つけることができなかった場合は実行されません。マスターではそれはあなたのものを実行したでしょう。パフォーマンスの問題があるため、接頭辞sp_を付けてprocを作成しないでください。
シャンキー2016

Shankyは、SQL Server開発チームによって設定されたと述べたとき、「なぜ」の質問に直接回答したと思います。なぜそうなったのか、なぜ関数の振る舞いが手続きと矛盾しているのかを尋ねることができますが、答えはおそらくあまり重要ではありません。
Michael J Swart 2016

1
ところで、 "sp_"で始まるプロシージャのパフォーマンスへの影響は測定できません。それは何年もの間問題ではありませんでした。spプレフィックスはまだ良い考えではないかもしれませんが、パフォーマンスは理由ではありません。
マイケル・J Swart

10

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

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

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

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

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


次に、SPとはなぜ異なるのか。あなたが言ったように、名前の衝突を避けるためかもしれません。ユーザーデータベースにSP "create procedure sp_help as select getdate()"を作成しました。スキーマ(dbo)ありまたはなしで実行すると、SQL ServerはシステムSPを参照します。作成したSPが実行されないのはなぜですか。
Rajesh Ranjan

3
@Rajesh。sp_で始まるオブジェクトは、常にマスター/リソースデータベースを検索する特殊なケースです。そして、この接頭辞は避けなければならないことが文書化されています。組み込み関数にはそのような規則はありません。
マーティン・スミス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.