Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cấp đặc quyền đã chọn cho các hàng có điều kiện

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cần trợ giúp trong việc tạo menu động

  2. MYSQ &MVC3 Lỗi kết nối SQL \ ProviderManifestToken nhưng tôi đang sử dụng MySQL

  3. Tạo lượt tham dự trong laravel

  4. giá trị nút radio để thêm

  5. Có cách nào để tạo UUID dựa trên thời gian / nút trở về trước trong PHP không?