sql >> Databáze >  >> RDS >> Mysql

Udělte výběrové oprávnění řádkům s podmínkou

Zvažte následující:

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');

Dotaz:

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;

Dotaz se opírá o křížové spojení a sjednocení. Pokud jde o sjednocení, první část bude pro všechny uživatele stejná:všechny řádky od employees s nenulovým datem narození. Druhá část sjednocení vrátí nuly pro uživatele tak privilegované v variousRights stůl, kde si vysníte svá privilegia.

Výše uvedený dotaz lze přirozeně vložit do pohledu.

Podívejte se na manuálovou stránku mysql pro CURRENT_USER( ) funkce.

Pokud jde o cross join , přemýšlej o tom takhle. Je to kartézský produkt. Ale tabulka se připojila (jinak vr ) bude mít buď 1 řádek, nebo se vrátí 0. To určuje, zda privilegovaní uživatelé uvidí prázdné řádky data narození.

Poznámka:Výše ​​uvedené bylo testováno. Zdá se, že funguje dobře.




  1. Pochopení a čtení katalogu systému PostgreSQL

  2. Textové nebo číselné pole – jednoduchá metoda SQL pro přepínání datových typů

  3. docker compose MySQL kontejner [2002] Připojení odmítnuto

  4. Jak mohu vyřešit chybu ORA-01427 (jednořádkový poddotaz vrací více než jeden řádek)?