web-dev-qa-db-ja.com

ユーザー定義テーブルタイプの権限を一覧表示する方法は?

ユーザー定義のテーブルタイプをいくつか使用しています。彼らは非常に便利です。

次の簡単なスクリプトを実行して、それらに関する情報を表示できます。

SELECT o.* from sys.table_types o

ユーザーオブジェクトに対するすべての権限を示す手順があります。オブジェクトの名前も指定できます。コードはこれです:

DECLARE @OBJ SYSNAME
SELECT @OBJ ='%'  -- shows all objects 
;WITH
RADHARANI AS (

                SELECT
                    dp.NAME AS principal_name
                        ,dp.type_desc AS principal_type_desc
                        ,o.NAME AS object_name
                        ,o.type_desc
                        ,p.permission_name
                        ,p.state_desc AS permission_state_desc
                    FROM sys.all_objects  o
                        INNER JOIN sys.database_permissions  p ON o.OBJECT_ID=p.major_id
                        LEFT OUTER JOIN sys.database_principals  dp ON p.grantee_principal_id = dp.principal_id
                   WHERE O.OBJECT_ID > 0
                     AND O.TYPE <> 'S'    -- no system
                     AND O.parent_object_id = 0 -- no constraints
                     AND o.NAME like @OBJ

)


SELECT * FROM RADHARANI
SELECT @@ROWCOUNT

上記のコードでは、ユーザー定義のテーブルタイプのアクセス許可を示していません。

どうすればそれを達成できますか?

enter image description here

これらは、ユーザーが使用できるように、自分のタイプに付与する権限です。

USE [Bocss2]
GO

--=====================================================
-- create the DespatchStatus table type 
-- if it does not exist already
--=====================================================
IF NOT EXISTS (SELECT * from sys.table_types) BEGIN

            CREATE TYPE [dbo].[DespatchStatus] AS TABLE(
                lngDespatchStatusID int not null
            ,PRIMARY KEY CLUSTERED(lngDespatchStatusID)

            )
END
GO
use [Bocss2]
GO
GRANT REFERENCES ON TYPE::[dbo].[DespatchStatus] TO [WebDevelopment]
GO
GRANT VIEW DEFINITION ON TYPE::[dbo].[DespatchStatus] TO [WebDevelopment]
GO
GRANT EXECUTE ON TYPE::[dbo].[DespatchStatus] TO [WebDevelopment] AS [dbo]
GO

そして、これはストアドプロシージャ内での使用方法です。

--=====================================================
-- declare and populate the DespatchStatus
--=====================================================
DECLARE @DIS DespatchStatus;
INSERT INTO @DIS(lngDespatchStatusID) VALUES (7)
INSERT INTO @DIS(lngDespatchStatusID) VALUES (11)
INSERT INTO @DIS(lngDespatchStatusID) VALUES (17)
INSERT INTO @DIS(lngDespatchStatusID) VALUES (19)

最後に、アーロンの回答に触発されて、私の許可スクリプトは次のようになりました(UNION ALLを使用)。

 DECLARE @OBJ SYSNAME
        SELECT @OBJ ='%'  -- shows all objects 
        ;WITH
        RADHARANI AS (

                        SELECT
                            dp.NAME AS principal_name
                                ,dp.type_desc AS principal_type_desc
                                ,o.NAME AS object_name
                                ,o.type_desc
                                ,p.permission_name
                                ,p.state_desc AS permission_state_desc
                            FROM sys.all_objects  o
                                INNER JOIN sys.database_permissions  p ON o.OBJECT_ID=p.major_id
                                LEFT OUTER JOIN sys.database_principals  dp ON p.grantee_principal_id = dp.principal_id
                           WHERE O.OBJECT_ID > 0
                             AND O.TYPE <> 'S'    -- no system
                             AND O.parent_object_id = 0 -- no constraints
                             AND o.NAME like @OBJ

                       UNION ALL

                        SELECT
                            dp.NAME AS principal_name
                                ,dp.type_desc AS principal_type_desc
                                ,o.NAME AS object_name
                                ,[type_desc] = 'User-Defined Table Type' 
                                ,p.permission_name
                                ,p.state_desc AS permission_state_desc
                            FROM sys.table_types  o
                                INNER JOIN sys.database_permissions  p ON o.user_type_id=p.major_id
                                LEFT OUTER JOIN sys.database_principals  dp ON p.grantee_principal_id = dp.principal_id
                           WHERE o.NAME like @OBJ

        )


        SELECT * FROM RADHARANI
        SELECT @@ROWCOUNT

下の画像を見るとわかるように、すべてのオブジェクトの後に、テーブルの種類がその権限と共に表示されています。

enter image description here

5

これにより、テーブルタイプに対して明示的に付与された権限がリストされますが、ロールまたはグループメンバーシップを介して暗黙的に付与された権限、または包含スキーマに対して付与された権限はリストされません。

SELECT 
  [schema] = s.name, 
  [type] = t.name, 
  [user] = u.name, 
  p.permission_name, 
  p.state_desc
FROM sys.database_permissions AS p
INNER JOIN sys.database_principals AS u
  ON p.grantee_principal_id = u.principal_id
INNER JOIN sys.types AS t
  ON p.major_id = t.user_type_id--.[object_id]
INNER JOIN sys.schemas AS s
  ON t.[schema_id] = s.[schema_id]
WHERE p.class = 6; -- TYPE

システムでテーブルの種類に使用している明示的なアクセス許可の種類に興味がありますか? ドキュメント より、標準のランタイムクエリサポートのために実装する必要のある部分はそれほど多くありません(たとえば、SELECTを直接付与することはできません)。これは主にメタデータ/コントロールのためにあるようです。

5
Aaron Bertrand