SQL Serverスキーマにはどのようなメリットがありますか?


185

SQLデータベース、特にSQL Serverを使用するのは初心者ではありません。ただし、私は主にSQL 2000の人であり、2005年以降は常にスキーマに戸惑っていました。はい、スキーマの基本的な定義は知っていますが、一般的なSQL Serverの展開で実際に何を使用していますか?

私はいつもデフォルトのスキーマを使ってきました。特殊なスキーマを作成する理由は何ですか?なぜ組み込みスキーマを割り当てるのですか?

編集:明確にするために、私はスキーマの利点を探していると思います。これをセキュリティスキームとしてのみ使用する場合は、データベースロールが既にその役割を果たしているようです。そして、それを名前空間指定子として使用することは、所有権(dbo対ユーザーなど)を使用して実行できるもののようでした。

私が得ているのは、所有者とロールでは実行できなかったスキーマの機能です。それらの具体的な利点は何ですか?

回答:


164

スキーマは、テーブル、プロシージャ、ビューを論理的にグループ化します。employeeスキーマ内のすべての従業員関連オブジェクトなど

また、1つのスキーマのみにアクセス許可を付与して、ユーザーがアクセスできるのはスキーマだけで、他には何も表示されないようにすることもできます。


21
スキーマにアクセス許可を割り当てることができるため、管理の観点から見ると、その価値は高くなります。
Hakan Winther、

9
別のデータベースを使用できませんか?
sam yi 2014年

7
このスキーマの許可は紙の上では良さそうに聞こえますが、適切に使用されることはほとんどありません。私にはそれは問題を起こす価値はありません。
sam yi 2014年

3
しかし、その場合は、命名規則を使用して同じことを達成できませんでしたか?私はそれのユースケースがないことを示唆していません。多くの場合、それは減算による加算です。
sam yi 2014

6
@ Ajedi32、そう...スキーマを使用すると、単一のトランザクションログで単一のアトミックコミットを取得し、同期していない2つのデータベースを使用したり、分散トランザクションと戦ったりするのに対して、すべてのデータを一度にバックアップできます。
マシューホワイト、

31

C#コードの名前空間と同じです。


16
ただし、残念ながら、スキーマと.NET名前空間は、ORMの観点(つまりEntity Framework)から見ると、あまりうまく連携していません。MyDatabase.MySchemaスキーマのテーブルは、MyProject.MyDatabase.MySchema名前空間のエンティティクラスに魔法のようにマッピングされません。また.、テーブル名のドット表記()によるハッキング_は、クラス名のアンダースコア()として終了することにも注意してください。残念なことに、ただ食べ物。
Dan Lugg 2013

2
教えるための良いアナロジー。私はそれが文字通り100%取られるとは思わない...(これらの警告は実際にはマイナーに聞こえる)
サマンサブラナム

6
個人的には、それら .NET名前空間に似ていて、組織化の目的で(名前空間でできるように)任意の数のスキーマをネストできるようにしたいと思います。それと、私は彼らがEFでよりよくマッピングすることを望みます。
Dan Lugg、2014

それらは、私が考えることができるどの言語の名前空間のようなものでもありません
Tanveer Badar

29

また、プラグインデータの一種の名前衝突保護を提供することもできます。たとえば、SQL Server 2008の新しいChange Data Capture機能は、使用するテーブルを別のcdcスキーマに配置します。これにより、CDCテーブルとデータベースで使用されている実際のテーブルとの間の名前の競合を心配する必要がなくなり、実際のテーブルの名前を意図的に隠すことができます。


17

私はそれが古いスレッドであることを知っていますが、私は自分でスキーマを調べたところ、次のものがスキーマ使用の別の良い候補になると思いました:

データウェアハウスでは、さまざまなソースからのデータを使用して、ソースごとに異なるスキーマを使用し、スキーマに基づいてアクセスを制御できます。また、別の投稿者が上記で返信したように、さまざまなソース間の名前の衝突の可能性を回避します。


9

スキーマを個別にしておけば、特定のスキーマを新しいDBサーバーにデプロイすることでアプリケーションをスケーリングできます。(これは、明確な機能を持つのに十分な大きさのアプリケーションまたはシステムがあることを前提としています)。

例として、ロギングを実行するシステムを考えます。すべてのログテーブルとSPは[logging]スキーマにあります。システムの他の機能がロギングスキーマのオブジェクトと重複する(つまり、結合する)ことはまれですが、ロギングは良い例です。

この手法を使用するためのヒント-アプリケーション/システムのスキーマごとに異なる接続文字列を使用します。次に、スキーマ要素を新しいサーバーにデプロイし、スケーリングが必要なときに接続文字列を変更します。


8

私はこれについてブレントに同意する傾向があります...この議論をここで参照してください。http://www.brentozar.com/archive/2010/05/why-use-schemas/

要するに...スキーマは、非常に特殊なユースケースを除いて、それほど有用ではありません。物事が乱雑になります。あなたがそれを助けることができるならそれらを使わないでください。そして、K(eep)I(t)S(imple)S(tupid)ルールに従うようにしてください。


2
私はブレントが「スキーマは悪い」と主張しているとは思いません。デフォルト以外のスキーマを使用することは、デフォルトのスキーマを使用することよりもはるかに複雑です。残りの合計は正確です。
ジョセフデイグル2014

「[スキーマが正しく]使用されている場合、オブジェクトのグループごとに権限を分離できます。」〜brentozar.com/archive/2010/05/why-use-schemas
LL学習

7

スキーマに関連付けられているユーザーをエイリアスで除外するメリットはわかりません。ここに理由があります...

ほとんどの人は最初にロールを介して自分のユーザーアカウントをデータベースに接続します。ユーザーをsysadminまたはデータベースロールdb_ownerのいずれかに任意の形式で割り当てるとすぐに、そのアカウントは「dbo」ユーザーアカウントにエイリアスされるか、完全なデータベースに対する権限。これが発生すると、デフォルトのスキーマ(ユーザーアカウントと同じ名前)以外のスキーマに自分を割り当てても、それらのdbo権限は、ユーザーとスキーマの下に作成したオブジェクトに割り当てられます。そのちょっと無意味な.....そして名前空間だけで、それらのオブジェクトの真の所有権を混乱させます。あなたが私に尋ねると、その貧弱なデザイン....誰がそれを設計したか。

彼らがすべきことは「グループ」を作成し、スキーマとロールを捨て、グループのグループを好きな組み合わせで階層化できるようにし、各階層で、アクセス許可が継承されているか、拒否されているか、カスタムで上書きされているかをシステムに通知するもの。これははるかに直感的であり、DBAはこれらのオブジェクトの実際の所有者をより適切に制御できます。現在のところ、ほとんどの場合、dboのデフォルトのSQL Serverユーザーには、ユーザーではなく、それらの権限があります。


7

私が長年働いていたORACLEショップでは、スキーマを使用して、さまざまなフロントエンドアプリケーションに適用されるプロシージャ(およびパッケージ)をカプセル化していました。ユースケース、ユーザー、およびシステム要件がまったく異なるため、アプリケーションごとに異なる「API」スキーマを使用することが理にかなっていることがよくあります。たとえば、1つの「API」スキーマは、開発/構成アプリケーションが開発者のみが使用するためのものでした。別の「API」スキーマは、ビューとプロシージャ(検索)を介してクライアントデータにアクセスするためのものでした。独自のデータベースを持つアプリケーションと開発/構成およびクライアントデータを同期するために使用された別の「API」スキーマカプセル化コード。これらの「API」スキーマの一部は、カバーの下では、依然として他の「共通」を介して共通の手順と機能を共有します

スキーマは非常に役立つものですが、スキーマがないことはおそらく世界の終わりではありません。本当に、SQL Serverにパッケージがないために本当に問題が生じますが、それは別のトピックです。


Oracleでは、1インスタンス= 1データベース= 1ライセンスで支払うため、シェマを使用して、別のデータベースを作成したり、別のライセンスにお金を払ったりすることを避けています。SQL Serverでは、1台のサーバーで多くのデータベースを処理できます。
Patrick Honorez 2015年

5

スキーマは多くの新機能のようなものだと思います(SQL Serverやその他のソフトウェアツールに関係なく)。開発キットに追加する利点が、設計と実装の単純さの損失を相殺するかどうかを慎重に評価する必要があります。

スキーマはオプションの名前空間とほぼ同じであるように見えます。オブジェクト名が衝突し、アクセス許可の細分性が十分でない状況にいる場合は、次のツールを使用してください。(最初に、より基本的なレベルで処理する必要のある設計上の問題があるかもしれないと言う傾向があります。)

問題がある可能性があります。それが存在する場合、一部の開発者は短期的な利益のために何気なくそれを使い始めるでしょう。そこに入るとクズになります。


3

SQL Server 2000では、作成されたオブジェクトはその特定のユーザーにリンクされました。たとえば、ユーザーがSamがEmployeesなどのオブジェクトを作成した場合、そのテーブルはSam.Employeesのようになります。サムが会社を去る場合、または他のビジネスエリアに移動する場合はどうでしょうか。ユーザーSamを削除するとすぐに、Sam.Employeesテーブルはどうなりますか?おそらく、最初に所有権をSam.Employeesからdbo.Employessに変更する必要があります。スキーマは、この問題を解決するソリューションを提供します。サムは、Emp_Schemaなどのスキーマ内にすべてのオブジェクトを作成できます。ここで、彼がEmp_Schema内にオブジェクトEmployeesを作成した場合、そのオブジェクトはEmp_Schema.Employeesと呼ばれます。ユーザーアカウントSamを削除する必要がある場合でも、スキーマは影響を受けません。


1
2000年以来2つの新しいバージョンがあったので、これはもう当てはまりません
Hogan

0

開発-開発者はそれぞれ、独自のスキーマをサンドボックスとして取得してプレイします。


29
-1開発者がデータベースのコピー全体を個別のマシンで操作できるようにすることをお勧めします。そうしないと、スキーマ内の内容のみを安全に変更できます。ライブへの昇進を複雑にし、他の回答で説明されている他の理由でスキーマの分離も複雑にします。
Stephen Turner、

5
あなたが取り組んでいるアプリケーションについて話すことはできません...しかし、あなたの開発は可能な限り生産を反映すべきです。スキーマを開発ではなく、開発で使用すると問題が発生する可能性があります。
sam yi 2014

0

ここでは、SQL Serverでスキーマを使用する良い実装例を示します。ms-accessアプリケーションがいくつかありました。それらをASP.NETアプリポータルに変換したいと考えました。すべてのms-accessアプリケーションは、そのポータルのアプリケーションとして作成されます。すべてのms-accessアプリケーションには、独自のデータベーステーブルがあります。それらのいくつかは関連しています。SQLServerの一般的なdboスキーマにそれらを配置します。残りは独自のスキーマを取得します。ASP.NETアプリポータルのAppに属しているテーブルを知りたい場合は、簡単にナビゲート、視覚化、および保守できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.