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

条件付きの行に選択権限を付与する

    次のことを考慮してください:

    drop table if exists variousRights;
    create table variousRights
    (   -- whitelist table of various privileges
        id int auto_increment primary key,
        rightType varchar(100) not null,
        username varchar(100) not null
    );
    
    -- sample data below. For this exercise, all we care about is 'seeNullBirthDateRows'
    -- but other data is inserted to ferret out troubles with strategy (too many rows returned)
    insert variousRights (rightType,userName) values
    ('seeNullBirthDateRows','[email protected]'),
    ('seeNullBirthDateRows','[email protected]'),
    ('seeSecretIDs','[email protected]'),
    ('insertThing101','[email protected]');
    
    drop table if exists employees;
    create table employees
    (   id int auto_increment primary key,
        empName varchar(100) not null,
        birthDate date null
    );
    
    -- sample data inserted. One has a null for birthDate (empty as you say in the question)
    insert employees(empName,birthDate) values
    ('John Smith',null),
    ('Sally Higgins','2016-02-07'),
    ('John Smith','2010-01-27');
    

    クエリ:

    select id,empName,birthDate 
    from employees
    where birthDate is not null
    union
    select e.id,e.empName,e.birthDate 
    from employees e
    cross join (select id from variousRights where rightType='seeNullBirthDateRows' and userName=current_user()) vr
    where e.birthDate is null;
    

    クエリは、クロスジョインとユニオンに依存しています。ユニオンに関しては、最初の部分はすべてのユーザーで同じになります。employeesのすべての行です。 null以外のbirthDayを使用します。ユニオンの2番目の部分は、variousRightsで特権を与えられているユーザーにnullを返します。 特権を夢見るテーブル。

    当然、上記のクエリはビューに追加できます。

    CURRENT_USER( ) 機能。

    cross joinについて 、このように考えてください。デカルト積です。しかし、テーブルは結合しました(エイリアスvr )1行または0行が戻ってきます。これが、特権ユーザーにnullのbirthDate行が表示されるかどうかを決定するものです。

    注:上記はテスト済みです。正常に動作しているようです。




    1. JDBC接続-Class.forNameとClass.forName()。newInstance?

    2. OpenShiftアプリがMySQLに接続できません:JDBCConnectionException:接続を開くことができませんでした

    3. OracleFormsからMicrosoftWordのスペルチェックを呼び出す際のVistaフォーカスの問題

    4. mysqlからphpに大きなデータを取得する方法は?