sql >> データベース >  >> RDS >> Sqlserver

現在のユーザーの役割を照会する方法

    非推奨の下位互換性ビュー (このページで sysusers を検索してください 、たとえば )。代わりに、 sys.database_principals および sys.database_role_members .現在の接続がデータベースの範囲外のアクセスを許可されている可能性があることに注意してください (たとえば、ユーザーがたまたま sysadmin である場合、これらは空の結果を返します) その場合、ロール メンバーシップや特定のアクセス許可を明示的に付与する必要はありません)。また、ロールの範囲外で明示的に割り当てられたアクセス許可についても、ロールによって提供されるアクセス許可をオーバーライドするため、さらに sys.database_permissions .以下は自己完結型の例です (まだ blatfarA という名前のログインを持っていない場合)。 または floob というデータベース ).

    CREATE LOGIN blatfarA WITH PASSWORD = 'foo', CHECK_POLICY = OFF;
    GO
    CREATE DATABASE floob;
    GO
    USE floob;
    GO
    CREATE USER blatfarB FROM LOGIN [blatfarA] WITH DEFAULT_SCHEMA = dbo;
    GO
    GRANT SELECT, UPDATE ON SCHEMA::dbo TO blatfarB;
    DENY INSERT, EXECUTE ON SCHEMA::dbo TO blatfarB;
    GO
    EXEC sp_addrolemember N'db_datareader', N'blatfarB'
    GO
      

    テストするには:

    EXECUTE AS LOGIN = N'blatfarA';
    GO
    
    DECLARE @login NVARCHAR(256), @user NVARCHAR(256);
    
    SELECT @login = login_name FROM sys.dm_exec_sessions WHERE session_id = @@SPID;
    
    SELECT @user = d.name
      FROM sys.database_principals AS d
      INNER JOIN sys.server_principals AS s
      ON d.sid = s.sid
      WHERE s.name = @login;
    
    SELECT u.name, r.name
      FROM sys.database_role_members AS m
      INNER JOIN sys.database_principals AS r
      ON m.role_principal_id = r.principal_id
      INNER JOIN sys.database_principals AS u
      ON u.principal_id = m.member_principal_id
      WHERE u.name = @user;
    
    SELECT class_desc, major_id, permission_name, state_desc
      FROM sys.database_permissions
      WHERE grantee_principal_id = USER_ID(@user);
    
    GO
    REVERT;
      

    結果:

    name      name
    --------  -------------
    blatfarB  db_datareader
    
    class_desc  major_id  permission_name  state_desc
    ----------  --------  ---------------  ----------
    DATABASE    0         CONNECT          GRANT
    SCHEMA      1         INSERT           DENY
    SCHEMA      1         EXECUTE          DENY
    SCHEMA      1         SELECT           GRANT
    SCHEMA      1         UPDATE           GRANT
      

    クリーンアップ:

    USE master;
    GO
    ALTER DATABASE floob SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
    GO
    DROP DATABASE floob;
    GO
    DROP LOGIN blatfarA;
    GO
      


    1. ORA-00997の回避策:LONGデータ型の不正使用

    2. MySQLは、「<」または「>」演算子とともに使用された場合、DATEにインデックスを使用しませんか?

    3. どちらが速いですか:MySQL / PHPまたは静的ファイルから直接提供しますか?

    4. MySQL-1つのINSERTステートメントにいくつの行を挿入できますか?