sql >> Database >  >> RDS >> Mysql

Verleen selectierecht aan rijen met voorwaarde

Overweeg het volgende:

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

De vraag:

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;

De query is gebaseerd op een Cross Join en een vakbond. Wat betreft de vakbond, het eerste deel zal hetzelfde zijn voor alle gebruikers:alle rijen van employees met een niet-null-verjaardag. Het tweede deel van de unie retourneert de nulls voor gebruikers die zo bevoorrecht zijn in de variousRights tafel waar u uw privileges verzint.

Natuurlijk kan de bovenstaande zoekopdracht in een weergave worden gepropt.

Zie de mysql-handleiding voor de CURRENT_USER( ) functie.

Wat betreft de cross join , denk er zo over. Het is een cartesiaans product. Maar de tafel deed mee (alias vr ) heeft ofwel 1 rij of 0 die terugkomt. Dat is wat bepaalt of bevoorrechte gebruikers de null birthDate-rijen zien.

Let op:Bovenstaande is getest. Lijkt goed te werken.




  1. De beste manier om de laatst ingevoegde ID in mysql te vinden met behulp van php

  2. kan geen verbinding maken met de Postgres (pg) -database vanuit mijn Ruby Script met behulp van gem pg (Dit is geen rails, gewoon pure ruby)

  3. MYSQL OP DUPLICATE KEY UPDATE is niet bijgewerkt

  4. hoe gegevens op te halen uit twee tabellen in mysql?