タイトルが示すように、ユーザーに SQL Server の既定のデータベースを割り当てると、そのデータベースへのアクセス許可が付与されますか? ユーザーに読み取り/書き込み権限を付与しますか? 完全な管理者? なし?
ありがとう!
タイトルが示すように、ユーザーに SQL Server の既定のデータベースを割り当てると、そのデータベースへのアクセス許可が付与されますか? ユーザーに読み取り/書き込み権限を付与しますか? 完全な管理者? なし?
ありがとう!
いいえ、そのデータベースに対する権限は与えられません。
CREATE LOGIN [Foo] WITH PASSWORD=N'foo',
DEFAULT_DATABASE=[AdventureWorks2012],
DEFAULT_LANGUAGE=[British],
CHECK_EXPIRATION=OFF,
CHECK_POLICY=OFF
次に、それらの資格情報でログインすると、エラー メッセージが表示されます
ユーザーの既定のデータベースを開けません。ログインに失敗しました。ユーザー「Foo」のログインに失敗しました。
まず SQL Server では、ユーザーとログインが存在します。大まかに言えば、ログインはサーバー レベルであり、ユーザーはデータベース レベルです。ユーザーが特定のログイン認証情報を使用してデータベースに接続できるようにするには、ユーザーをログインにマップする必要があります。
ユーザーではなく、デフォルトのデータベースが割り当てられるのはログインです。
これで問題が解決したら、パーミッションを処理しましょう。データベース内の各ユーザーには、デフォルトで「パブリック」データベース ロールが割り当てられます。役割を削除したり、役割からユーザーを削除したりすることはできません。データベースでユーザーに明示的なアクセス許可が割り当てられていない場合、そのユーザーには public ロールに与えられたアクセス許可が与えられます。これらのアクセス許可とは、明らかにそれぞれのケースで異なります - それらは付与されたものです。それらを確認するには、次のスクリプトを実行できます。
WITH [PublicRoleDBPermissions]
AS
(SELECT p.[state_desc] AS [PermissionType]
,p.[permission_name] AS [PermissionName]
,USER_NAME(p.[grantee_principal_id]) AS [DatabaseRole]
,CASE p.[class]
WHEN 0 THEN 'Database::' + DB_NAME()
WHEN 1 THEN OBJECT_NAME(major_id)
WHEN 3 THEN 'Schema::' + SCHEMA_NAME(p.[major_id])
END AS [ObjectName]
FROM [sys].[database_permissions] p
WHERE p.[class] IN (0, 1, 3)
AND p.[minor_id] = 0)
SELECT [PermissionType]
,[PermissionName]
,[DatabaseRole]
,SCHEMA_NAME(o.[schema_id]) AS [ObjectSchema]
,[ObjectName]
,o.[type_desc] AS [ObjectType]
,[PermissionType]
+ ' ' + [PermissionName]
+ ' ON ' + QUOTENAME(SCHEMA_NAME(o.[schema_id]))
+ '.' + QUOTENAME([ObjectName])
+ ' TO ' + QUOTENAME([DatabaseRole]) AS [GrantPermissionTSQL]
,'REVOKE'
+ ' ' + [PermissionName]
+ ' ON ' + QUOTENAME(SCHEMA_NAME(o.[schema_id]))
+ '.' + QUOTENAME([ObjectName])
+ ' TO ' + QUOTENAME([DatabaseRole]) AS [RevokePermissionTSQL]
FROM [PublicRoleDBPermissions] p
JOIN [sys].[objects] o
ON o.[name] = p.[ObjectName]
AND OBJECTPROPERTY(o.object_id, 'IsMSShipped') = 0
WHERE [DatabaseRole] = 'Public'
ORDER BY [DatabaseRole], [ObjectName], [ObjectType]
public ロールに何も明示的に付与されていない場合、ユーザーには権限がありません。たとえば、これを実行すると (最初の部分はhere から借用されます):
CREATE LOGIN [Foo] WITH PASSWORD=N'foo',
DEFAULT_DATABASE=[AdventureWorks2012],
DEFAULT_LANGUAGE=[British],
CHECK_EXPIRATION=OFF,
CHECK_POLICY=OFF
GO
CREATE USER [Bar] FOR LOGIN [Foo]
GO
次に、Foo ログインの下のデータベースから選択してみます。
select * from person.address
もらいます
オブジェクト 'Address'、データベース 'AdventureWorks2012'、スキーマ 'Person' に対する SELECT 権限が拒否されました。
これは、データベースの public ロールに追加の権限がないためです。
いいえ、そのデータベースに明示的に許可を与える必要があります。そうでなければ、特権はありません。
CREATE USERも確認してください。
ユーザーを作成すると、データベースへのアクセスが許可されますが、データベース内のオブジェクトへのアクセスが自動的に許可されるわけではありません。ユーザーを作成した後の一般的なアクションは、データベース オブジェクトへのアクセス権限を持つデータベース ロールにユーザーを追加するか、ユーザーにオブジェクト権限を付与することです。
CREATE LOGINも確認してください。