Considere lo siguiente:
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 consulta:
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 consulta se basa en un Cross Join y una unión. En cuanto al sindicato, la primera parte será la misma para todos los usuarios:todas las filas de employees
con un cumpleaños no nulo. La segunda parte de la unión devolverá los valores nulos para los usuarios tan privilegiados en variousRights
mesa donde sueñas tus privilegios.
Naturalmente, la consulta anterior se puede colocar en una vista.
Consulte la página del manual de mysql para CURRENT_USER( ) función.
En cuanto a la cross join
, Piénsalo de esta manera. Es un producto cartesiano. Pero la mesa se unió (alias vr
) tendrá 1 fila o 0 regresando. Eso es lo que determina si los usuarios privilegiados ven o no las filas de fecha de nacimiento nulas.
Nota:Lo anterior ha sido probado. Parece funcionar bien.