sql >> Databasteknik >  >> RDS >> Mysql

Ge valbehörighet till rader med villkor

Tänk på följande:

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

Frågan:

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;

Frågan bygger på en Cross Join och en fackförening. När det gäller facket kommer den första delen att vara densamma för alla användare:alla rader från employees med en icke-null födelsedag. Den andra delen av unionen kommer att returnera nollvärdena för användare som är så privilegierade i variousRights tabell där du drömmer om dina privilegier.

Naturligtvis kan ovanstående fråga ploppas in i en vy.

Se mysql-manualsidan för CURRENT_USER( ) funktion.

När det gäller cross join , tänk på det så här. Det är en kartesisk produkt. Men tabellen gick med på (alias vr ) kommer antingen att ha 1 rad eller 0 som kommer tillbaka. Det är det som avgör om privilegierade användare ser raderna med null födelsedatum eller inte.

Obs:Ovanstående har testats. Verkar fungera bra.




  1. Ska jag använda NOT IN, OUTER APPLY, LEFT OUTER JOIN, EXCEPT eller INTE FINNS?

  2. MySql frågeanalysator - gratis lösningar

  3. Bifoga en MDF-fil utan LDF-fil

  4. Java 11-migrering - createConnectionBuilder() från PoolDataSourceImpl krockar med createConnectionBuilder() från javax.sql.DataSource