1

タイトルが示すように、ユーザーに SQL Server の既定のデータベースを割り当てると、そのデータベースへのアクセス許可が付与されますか? ユーザーに読み取り/書き込み権限を付与しますか? 完全な管理者? なし?

ありがとう!

4

3 に答える 3

2

いいえ、そのデータベースに対する権限は与えられません。

CREATE LOGIN [Foo] WITH PASSWORD=N'foo', 
                    DEFAULT_DATABASE=[AdventureWorks2012], 
                    DEFAULT_LANGUAGE=[British], 
                    CHECK_EXPIRATION=OFF, 
                    CHECK_POLICY=OFF

次に、それらの資格情報でログインすると、エラー メッセージが表示されます

ユーザーの既定のデータベースを開けません。ログインに失敗しました。ユーザー「Foo」のログインに失敗しました。

于 2013-10-20T19:41:40.207 に答える
1

まず 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 ロールに追加の権限がないためです。

于 2013-10-20T20:32:21.723 に答える
1

いいえ、そのデータベースに明示的に許可を与える必要があります。そうでなければ、特権はありません。

CREATE USERも確認してください。

ユーザーを作成すると、データベースへのアクセスが許可されますが、データベース内のオブジェクトへのアクセスが自動的に許可されるわけではありません。ユーザーを作成した後の一般的なアクションは、データベース オブジェクトへのアクセス権限を持つデータベース ロールにユーザーを追加するか、ユーザーにオブジェクト権限を付与することです。

CREATE LOGINも確認してください。

于 2013-10-20T19:12:32.247 に答える