web-dev-qa-db-ja.com

ユーザーがスキーマの作成権限を持っているかどうかを確認するにはどうすればよいですか?

テーブルとストアドプロシージャを作成できるユーザーアカウントをデータベースに持っています。

このユーザーアカウントがスキーマを作成できるかどうかを確認したい-最初に作成しようとしないで。 (私はITではなく財務の一部です)Schema'sを作成できる場合は、ITに先に進んで作成する許可を求めます。できない場合は、しばらく前に入力したサービスデスクリクエストでITがそれを行うのを待ち続けますsigh

実際に新しいスキーマを作成せずにこれを通知するSSMSで実行できるコマンドはありますか?

このユーザーの権限のスクリーンショットもいくつか撮りました-おそらく答えがあるでしょうか?

DB Permissions 1

DB Permissions 2

編集:以下のSQLServingによって提案されたSQLを実行すると、次の結果が得られます。

UserName    is_disabled principal_type_desc class_desc  object_name permission_name permission_state_desc
DWReports   0   SQL_USER    DATABASE    NULL    CONNECT GRANT
DWReports   0   SQL_USER    OBJECT_OR_COLUMN    GetSystemSQLAgentJobList    EXECUTE GRANT
2
kiltannen

このスキーマを作成できないように見えますが、そうですか?

いいえ、それは間違っています。あなたはdb_ownerなので、データベースに必要なすべてを作成できます。メンバーシップのある最初の写真を見てください。

上記の回答のエラーは、特定のユーザーに対して明示的に許可されたアクセス許可のみを考慮していることです。ただし、ユーザーは1000個のロールのメンバーである可能性があり、これらのロールに権限を与えることができます。

あなたのケースでは、データベースを制御する固定データベースロールdb_ownerのメンバーなので、データベース内で何でも実行できます。

データベースでの有効な権限を確認するには、次のコマンドを実行します。

select * from sys.fn_my_permissions(null, 'database');
3
sepupic

HAS_PERMS_BY_NAME

select HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'CREATE SCHEMA');

これにより、すべてのWindowsグループ、ロール、および固定ロールメンバーシップを含むアクセス許可が正しく考慮されます。 GRANTとDENYも正しく考慮されます。

2
Remus Rusanu

このクエリを実行すると、ユーザーの権限を確認できるはずです(ここでは、sysテーブルへの読み取り権限があることを前提としています)。

SELECT        
USER_NAME(dppriper.grantee_principal_id) AS UserName, 
sppri.is_disabled, 
dppri.type_desc AS principal_type_desc, 
dppriper.class_desc, 
OBJECT_NAME(dppriper.major_id) AS object_name, 
dppriper.permission_name, 
dppriper.state_desc AS permission_state_desc
FROM            
sys.database_permissions AS dppriper INNER JOIN
sys.database_principals AS dppri 
ON dppriper.grantee_principal_id = dppri.principal_id LEFT OUTER JOIN
sys.server_principals AS sppri 
ON sppri.sid = dppri.sid 
Where USER_NAME(dppriper.grantee_principal_id)='DWReports'  
0
SQLserving