SQL 2008 R2は、Windowsユーザーがテーブルを作成するときにユーザー/スキーマを作成します


9

次のスクリプトを使用して、WindowsグループをSQL 2008 R2インスタンスにマップするサーバーログインとデータベースユーザーを追加しました。匿名のために名前を変更しました。

USE master
go
CREATE LOGIN [DOMAIN\AppUsers] FROM WINDOWS
WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]
go
USE AppDb
go
CREATE USER [DOMAIN\AppUsers] FOR LOGIN 
[DOMAIN\AppUsers]
go
EXEC sp_addrolemember N'db_owner', N'DOMAIN\AppUsers'
go

DOMAIN \ User1アカウントがアプリにログオンすると、User1はDOMAIN \ AppUsersのメンバーであるため、User1はdboスキーマのテーブルに問題なくクエリを実行しますが、このアプリではユーザーがテーブルを作成することもできます。スキーマを指定せずにこれらのテーブル作成すると、SQL Serverは次のことを行います。

  1. インスタンスのSSMS \ Security \ Loginsにリストされていない 'DOMAIN \ User1'ログインを使用するAppDbに 'DOMAIN \ User1'ユーザーを作成します。
  2. AppDbに「DOMAIN \ User1」スキーマを作成します。
  3. 新しい「DOMAIN \ User1」スキーマでを使用してこれらのテーブルを作成します。

私はこれらの結果に完全に困惑しています。ここに私の質問があります:

  1. 追加のオブジェクトを作成するのではなく、テーブルの作成が失敗することを期待します。これを説明しているBooks Onlineの部分を誰かに教えてもらえますか?
  2. サーバーがスキーマを追加しようとしているのに、サーバーが 'DOMAIN \ AppUsers'スキーマを作成せず、そのスキーマに新しいテーブルを追加しないのはなぜですか?
  3. また、データベースはSSMS \ Security \ Loginsに表示されないログインをどのように使用しますか?
  4. SSMS \ Databases \ AppDb \ Security \ Usersの「DOMAIN \ User1」ユーザーを見ると、ユーザーアイコンに小さな赤い矢印が下向きになっています。どういう意味ですか?

単純化のためにSQL認証を好む組織内でWindows認証を使用し始めたばかりなので、私の違いは違いを知らないことに起因していると私は確信しています。このコードは、Windows認証の使用を検討するずっと前から作成されているため、Windows認証を使用してデータベース所有者以外のユーザーとしてログオンした場合の新しいスキーマの作成に関する理解を深める必要があります。

わからない場合は、SQL認証よりもWindows認証の使用を強く求めているのは私です。これについてしっかりと理解できなければ、SQL認証に戻ります。


ドメインユーザーに対してはデフォルトのスキーマ{dbo、たとえば}を定義できますが、ドメイングループに対しては定義できません。

回答:


9

これはSQL Server 2000に戻って常に発生していました。
スキーマがない場合、SQL Serverはdboスキーマにスキーマを配置することをどのようにして認識しますか?

デフォルトのスキーマを指定する唯一の方法は次のとおりです。

  • SQLログインを使用する(Windowsではない)
  • 「sysadmin」として実行

これらはどちらも受け入れられません

ベストプラクティスは、DDLおよびDMLのすべてのオブジェクト参照のスキーマを常に修飾することです。プランを再利用することで、パフォーマンスが明らかに向上します。

また、SQL Server 2005では、意図的なスキーマの使用がより適切です。

  • のテーブル Data
  • 内の他の表ArchiveStagingなど
  • クライアントのアクセス許可ごとのスキーマ内のコード:DesktopWebGUIなど

dboスキーマの使用は最後の千年紀です:-)リンク:


つまり、これを取り除いて、新しいテーブルにスキーマのプレフィックスを付けるようにコードを更新する必要があるということです。これは、セキュリティノードの下に新しいユーザーが表示されることはよくあることですか?
flipdoubt

@flipdoubt:どちらもそうです。スキーマに
アクセスし

最後の質問です。ユーザーを自動的に追加することが一般的であり、オブジェクトの作成中にスキーマを指定することがベストプラクティスである場合、自動作成されたユーザーが新しいスキーマ内のオブジェクトのクエリエラーを作成する前に、新しいスキーマに権限を付与するにはどうすればよいですか?「DOMAIN \ User1」に関して投稿した例を使用して、「DOMAIN \ AppUsers」アカウントへのアクセスを割り当てることができますが、クエリは「DOMAIN \ User1」または「DOMAIN \ AppUsers」のアクセス権を使用しますか?オブジェクトが作成されるとすぐにサーバーがユーザーを作成するほど、卑劣です。
2011年

権限はデフォルトでスキーマ所有者(user1)になります。これはスキーマのDB_OWNERに似ています
gbn '23年

2

まあ@gbn型は私より速い...

私の唯一の製品です...あなたは、ユーザーがアプリにログインしていると参照それは、ユーザがテーブルと、このようなを作成することができます。アプリケーションがこれを許可し、ユーザーがSQL Server自体を介してこれを行わない場合(SSMSを使用してデータベースに直接ログイン)、そのアプリケーションのベンダーに確認する必要があります。


アプリを書きました。
flipdoubt

2

質問は非常に古く、既に受け入れられた回答がありますが、私は(一般的なアドバイスを与えるのではなく)より具体的に質問に回答するように努めます。

  1. 動作はhttps://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sqlのセクション「暗黙的なスキーマとユーザーの作成」に記載されています

  2. オブジェクトを特定のスキーマで作成する場合(ステートメントでスキーマが明示的に指定されていない場合)、ユーザーにDEFAULT_SCHEMAを指定する必要があります。SQL Server 2008 R2(およびそれ以前のバージョン)では、DEFAULT_SCHEMAをWindowsグループに基づいてユーザーに割り当てようとするとエラーが発生しましたが、SQL Server 2012(およびそれ以降のバージョン)ではこれが可能になりました。

  3. そのユーザーのログインがないという理由だけで表示されません。https://docs.microsoft.com/en-us/sql/t-sql/statements/create-user-transact-sqlで指定されているように、別のグループを使用して、またはログイン。

  4. 小さな赤い矢印(またはSSMSの新しいバージョンでは小さな赤いx)は、データベースにCONNECT権限がないユーザーを表します(ただし、この権限は別のグループを通じて取得される場合があります)。


0

これは古い質問ですが、(SQL Server 2014で)この動作を観察したところ、次のことがわかりました。

スクリプトを考える

USE [master]
CREATE DATABASE [Test]

USE [Test]

-- Note that we create the users without specifying the default schema
CREATE USER [MyDomain\MyADGroup] FOR LOGIN [MyDomain\MyADGroup] -- ad group
CREATE USER [MyDomain\MyDomainUser] FOR LOGIN [MyDomain\MyDomainUser] -- ad user (not in said AD group)

ALTER ROLE db_ddladmin ADD MEMBER [MyDomain\MyADGroup]
ALTER ROLE db_ddladmin ADD MEMBER [MyDomain\MyDomainUser]

EXECUTE AS LOGIN = 'MyDomain\MyAdGroupUser' -- a windows account which is a member of [MyDomain\MyADGroup]

CREATE TABLE Test
(
    a INT
)

REVERT 

EXECUTE AS USER = 'MyDomain\MyDomainUser'

CREATE TABLE Test
(
    a INT
)

このスクリプトは、Testという2つのテーブルを作成します。

最初にCREATE TABLE呼び出されるテーブルを[MyDomain\MyAdGroupUser].[Test]作成し、MyDomain\MyAdGroupUserスキーマ(およびMyDomain\MyAdGroupUser無効になっているデータベースユーザー)も作成します

2番目CREATE TABLEはと呼ばれるテーブルを作成します[dbo].[Test]

これは、CREATE TABLEコマンドがスキーマを明示的に指定しないため、デフォルトのスキーマが使用されるためです。

ユーザーの作成時にデフォルトスキーマを指定しなかったため、SQL ServerはWindowsユーザーのデフォルトスキーマをdboとして設定しますが、Windowsグループユーザーにはデフォルトスキーマを設定しないため、これによりスキーマ/ユーザーが作成されます

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