如何为视图DRVADM中包含的所有信息授予读取权限 除了出生日期对用户不是空的行外?
答案 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行的原因。
注意:以上内容已经过测试。似乎工作正常。