sql >> Database teknologi >  >> RDS >> Mysql

Tildel valgprivilegium til rækker med betingelse

Overvej følgende:

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

Forespørgslen:

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;

Forespørgslen er afhængig af en Cross Join og en fagforening. Hvad angår fagforeningen, vil den første del være den samme for alle brugere:alle rækker fra employees med en ikke-nul fødselsdag. Den anden del af foreningen vil returnere nullerne for brugere, der er så privilegerede i variousRights tabel, hvor du drømmer om dine privilegier.

Naturligvis kan ovenstående forespørgsel ploppes ind i en visning.

Se mysql-manualsiden for CURRENT_USER( ) funktion.

Med hensyn til cross join , tænk på det på denne måde. Det er et kartesisk produkt. Men tabellen sluttede sig til (alias vr ) vil enten have 1 række eller 0, der kommer tilbage. Det er det, der afgør, om privilegerede brugere ser nul-fødselsdato-rækkerne.

Bemærk:Ovenstående er blevet testet. Ser ud til at fungere fint.




  1. Udfør en pl/sql-funktion med OracleCommand

  2. SQL ranking løsning

  3. MySQL - UPDATE-forespørgsel baseret på SELECT-forespørgsel

  4. Lukning/pooling af MySQL ODBC-forbindelser