Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Berikan hak istimewa pilih ke baris dengan kondisi

Pertimbangkan hal berikut:

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

Pertanyaannya:

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;

Kueri bergantung pada Cross Join dan union. Adapun serikat pekerja, bagian pertama akan sama untuk semua pengguna:semua baris dari employees dengan hari ulang tahun non-null. Bagian kedua serikat akan mengembalikan nol untuk pengguna yang memiliki hak istimewa di variousRights meja tempat Anda memimpikan hak istimewa Anda.

Tentu saja kueri di atas dapat dimasukkan ke dalam tampilan.

Lihat halaman manual mysql untuk CURRENT_USER( ) fungsi.

Adapun cross join , anggap saja seperti ini. Ini adalah produk kartesius. Tapi tabel bergabung (alias vr ) akan memiliki 1 baris atau 0 kembali. Itulah yang menentukan apakah pengguna yang memiliki hak istimewa melihat baris tanggal lahir null atau tidak.

Catatan:Di atas telah diuji. Tampaknya berfungsi dengan baik.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tambahkan Kunci Asing ke tabel yang ada

  2. Masalah MySQL - LENGKAP server dikuasai! Mohon saran

  3. Bisakah saya menggunakan kolom non-agregat dengan grup menurut?

  4. Database PHP Argumen tidak valid disediakan untuk foreach()

  5. Bagaimana saya bisa mengambil peringatan setelah kueri node-mysql