Mysql
 sql >> Base de données >  >> RDS >> Mysql

Accorder le privilège de sélection aux lignes avec condition

Considérez ce qui suit :

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 requête :

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 requête repose sur une jointure croisée et une union. Comme pour le syndicat, la première partie sera la même pour tous les utilisateurs :toutes les lignes de employees avec un jour de naissance non nul. La deuxième partie de l'union renverra les valeurs nulles pour les utilisateurs ainsi privilégiés dans les variousRights table où vous imaginez vos privilèges.

Naturellement, la requête ci-dessus peut être insérée dans une vue.

Voir la page de manuel mysql pour le CURRENT_USER( ) fonction.

Quant à la cross join , Pense-y de cette façon. C'est un produit cartésien. Mais la table rejoint le (alias vr ) aura soit 1 ligne soit 0 retour. C'est ce qui détermine si les utilisateurs privilégiés voient ou non les lignes null birthDate.

Remarque :ce qui précède a été testé. Semble bien fonctionner.