Jawabannya tergantung pada kebutuhan Anda untuk hasilnya. Apakah Anda memerlukan hasil dengan kumpulan kolom yang konsisten, terlepas dari privasi pengguna? Jika demikian, Anda dapat menyetel nilai yang tidak diizinkan ke 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 merupakan kolom terlarang maka Anda tidak dapat menggunakan null.
Pendekatan lain akan meminta Anda menyertakan indikator hak istimewa untuk setiap kolom yang muncul di hasil, dan biarkan logika bisnis Anda menggunakannya untuk menentukan nilai mana yang terlihat oleh pengguna.
Pendekatan yang sangat berbeda akan membuat hasil ditetapkan hanya berisi 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
"eksekusi" yang berarti apa pun yang Anda miliki untuk mengeksekusi string sebagai perintah sql.
lebih lanjut setelah klarifikasi oleh OP:
Oke, Anda memerlukan fungsi sql yang mengembalikan string yang terlihat seperti "colname1, colname2, ...". Berikut ini menyerupai apa yang akan terlihat seperti di sql server. sintaks
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