Beachten Sie Folgendes:
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');
Die Abfrage:
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;
Die Abfrage basiert auf einem Cross Join und einer Union. Was die Union betrifft, so ist der erste Teil für alle Benutzer gleich:alle Zeilen von employees
mit einem Nicht-Null-Geburtstag. Der zweite Teil der Vereinigung gibt die Nullen für Benutzer zurück, die in variousRights
so privilegiert sind Tisch, an dem Sie sich Ihre Privilegien ausdenken.
Natürlich kann die obige Abfrage in eine Ansicht eingefügt werden.
Siehe die mysql-Handbuchseite für den CURRENT_USER( ) Funktion.
Wie beim cross join
, Denk darüber so. Es ist ein kartesisches Produkt. Aber der Tisch schloss sich an (alias vr
) wird entweder 1 Zeile oder 0 zurückkommen. Das bestimmt, ob privilegierte Benutzer die Nullzeilen für das Geburtsdatum sehen.
Hinweis:Das obige wurde getestet. Scheint gut zu funktionieren.