Mysql
 sql >> Database >  >> RDS >> Mysql

Concedi il privilegio di selezione alle righe con condizione

Considera quanto segue:

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

La domanda:

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;

La query si basa su un Cross Join e un'unione. Per quanto riguarda il sindacato, la prima parte sarà la stessa per tutti gli utenti:tutte le righe di employees con un compleanno non nullo. La seconda parte dell'unione restituirà i valori null per gli utenti così privilegiati in variousRights tavolo dove sogni i tuoi privilegi.

Naturalmente la query di cui sopra può essere inserita in una vista.

Consulta la pagina di manuale di mysql per CURRENT_USER( ) funzione.

Per quanto riguarda il cross join , Pensare in questo modo. È un prodotto cartesiano. Ma la tabella si è unita (alias vr ) avrà 1 riga o 0 come ritorno. Questo è ciò che determina se gli utenti privilegiati vedono o meno le righe di data di nascita nulle.

Nota:quanto sopra è stato testato. Sembra funzionare bene.