为具有条件的行授予select权限

时间:2016-05-28 03:30:49

标签: mysql mysql-workbench

如何为视图DRVADM中包含的所有信息授予读取权限 除了出生日期对用户不是空的行外?

1 个答案:

答案 0 :(得分:1)

请考虑以下事项:

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','root@localhost'),
('seeNullBirthDateRows','sam@localhost'),
('seeSecretIDs','root@localhost'),
('insertThing101','root@localhost');

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;

查询依赖于交叉连接和联合。对于联合,第一部分对于所有用户都是相同的:来自employees的所有行都具有非null birthDay。 union的第二部分将返回variousRights表中具有特权的用户的空值,您可以在其中设置您的权限。

当然,上述查询可以填入视图中。

请参阅CURRENT_USER()函数的mysql手册页。

至于cross join,请这样考虑。它是一种笛卡尔积。但是加入的表(别名vr)将有1行或0回来。这就是决定特权用户是否看到null birthDate行的原因。

注意:以上内容已经过测试。似乎工作正常。