Hãy xem xét những điều sau:
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');
Truy vấn:
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;
Truy vấn dựa trên Tham gia chéo và liên kết. Đối với liên minh, phần đầu tiên sẽ giống nhau cho tất cả người dùng:tất cả các hàng từ employees
với một ngày sinh không rỗng. Phần thứ hai của liên minh sẽ trả về giá trị null cho những người dùng có đặc quyền trong variousRights
bảng nơi bạn mơ ước các đặc quyền của mình.
Đương nhiên, truy vấn trên có thể được đưa vào một chế độ xem.
Xem trang hướng dẫn sử dụng mysql để biết CURRENT_USER ( ) chức năng.
Đối với cross join
, nghĩ theo cách này. Nó là một sản phẩm của các-ten. Nhưng bảng đã tham gia vào (bí danh vr
) sẽ có 1 hàng hoặc 0 trở lại. Đó là yếu tố xác định xem người dùng có đặc quyền có nhìn thấy các hàng Ngày sinh trống hay không.
Lưu ý:Ở trên đã được thử nghiệm. Có vẻ hoạt động tốt.