Saya memiliki tabel berikut ini:
UserPrivileges:
+--------+------+------+------+
| UserID | Col1 | Col2 | Col3 |
+--------+------+------+------+
| 1 | 0 | 1 | 1 |
| 2 | 0 | 0 | 1 |
| 3 | 1 | 0 | 0 |
| 4 | 1 | 1 | 0 |
+--------+------+------+------+
Data:
+--------+------+------+------+
| DataID | Col1 | Col2 | Col3 |
+--------+------+------+------+
| 1 | A | B | C |
| 2 | D | E | F |
| 3 | G | H | I |
| 4 | J | K | L |
+--------+------+------+------+
Pertanyaan saya pada bentuknya yang paling sederhana tidak ada hubungannya dengan tabel Data
tetapi saya hanya menjelaskannya sehingga saya mungkin melakukannya dengan cara yang salah.
Bagaimana saya memilih nama kolom dari UserPrivileges berdasarkan nilainya? Sehingga saya dapat menggunakan hasilnya di query lain untuk memilih hanya kolom-kolom tersebut.
Sesuatu di sepanjang garis ini:
SELECT (COLUMNS_NAME_QUERY_FROM_UserPrivileges(UserID='#')) WHERE DataID = '#' FROM Data
Atau saya tidak keberatan dengan cara yang lebih baik untuk mengelola Hak Istimewa pengguna untuk kolom tertentu.
Jawabannya tergantung pada persyaratan Anda untuk hasilnya. Apakah Anda memerlukan hasil dengan sekumpulan kolom yang konsisten, terlepas dari privs pengguna? Jika demikian, Anda bisa menetapkan nilai yang tidak diperbolehkan menjadi null (atau nilai khusus lainnya) menggunakan klausa IF, mis,
SELECT IF (p.col1 = 0 THEN NULL ELSE d.col1) AS col1,
IF (p.col2 = 0 THEN NULL ELSE d.col2) AS col2,
IF (p.col3 = 0 THEN NULL ELSE d.col3) AS col3
FROM Data d,
UserPrivileges p
WHERE p.userId = '#'
AND d.DataId = '#'
Tentu saja, "nilai khusus" bisa menjadi masalah, karena Anda memerlukan nilai yang tidak akan pernah muncul dalam data. Jika Anda perlu mengetahui perbedaan antara null karena nilai sebenarnya adalah null vs null karena itu adalah kolom terlarang, maka Anda tidak dapat menggunakan null.
Pendekatan lain akan membuat Anda dengan sederhana memasukkan indikator hak istimewa untuk setiap kolom yang muncul dalam hasil, dan biarkan logika bisnis Anda menggunakannya untuk menentukan nilai mana yang terlihat oleh pengguna.
Pendekatan yang sangat berbeda akan membuat hasil yang ditetapkan hanya berisi kolom-kolom yang diizinkan. Dalam hal ini, Anda harus membuat pernyataan sql Anda secara dinamis. Saya tidak tahu apakah Anda melakukan ini dalam prosedur tersimpan atau dalam bahasa host, tetapi ide dasarnya adalah seperti ini:
string sqlCmd = "SELECT "
+ (SELECT (FIELDS_NAME_QUERY(UserID='#')
FROM USER_PRIVILEGES
WHERE userid='#')
+ FROM data d
execute sqlCmd
"execute" artinya apa pun yang Anda miliki untuk mengeksekusi string sebagai perintah sql.
lebih lanjut setelah klarifikasi oleh OP:
Ok, Anda membutuhkan fungsi sql yang mengembalikan string yang terlihat seperti "colname1, colname2, ...". Berikut ini menyerupai apa yang akan terlihat seperti di sql server. sintaksis
create function
FIELDS_NAME_QUERY (@userid int)
begin
select col1, col2, col3... INTO @col1priv, @col2priv, @col3priv FROM userPrivileges WHERE UserId = @UserId
declare @result varhcar(60)
set @result = ''
if (@col1priv = 1) @result = 'col1'
if (@col2priv = 1) @result = @result + ' ,col2'
if (@col3priv = 1) @result = @result + ' ,col3'
return @result
end
belum mencobanya, tetapi sesuatu seperti ini seharusnya berhasil
SELECT (SHOW COLUMNS FROM table WHERE expr) FROM data WHERE DataID = '#'
Periksa postingan ini untuk detailnya - https://stackoverflow.com/questions/452464/how-can-i-get-column-names-from-a-table
Beri tahu kami bagaimana Anda menyelesaikan ini ...