Mysql
 sql >> база данни >  >> RDS >> Mysql

Дайте привилегия за избор на редове с условие

Помислете за следното:

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

Заявката:

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;

Заявката разчита на Cross Join и union. Що се отнася до обединението, първата част ще бъде една и съща за всички потребители:всички редове от employees с ненулев рожден ден. Втората част от обединението ще върне нули за потребители, така привилегировани в variousRights маса, където мечтаете за своите привилегии.

Естествено горната заявка може да бъде въведена в изглед.

Вижте страницата с ръководство за mysql за CURRENT_USER( ) функция.

Що се отнася до cross join , мислете за това по този начин. Това е декартов продукт. Но таблицата се присъедини към (псевдоним vr ) ще има или 1 ред, или 0, който се връща. Това е, което определя дали привилегированите потребители виждат или не нулевите редове с рождена дата.

Забележка:Горното е тествано. Изглежда, че работи добре.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Преобразувайте SQL резултатите в PHP масив

  2. PHPmailer - Многократно изпращане на имейл

  3. Съхранение на разрешения за приложение в база данни

  4. MYSQL променлива IN клауза

  5. Как да върна различни стойности и техния брой?