उत्तर परिणाम के लिए आपकी आवश्यकताओं पर निर्भर करता है। क्या आपको उपयोगकर्ता के निजीकरण की परवाह किए बिना कॉलम के एक सुसंगत सेट के साथ परिणाम की आवश्यकता है? यदि ऐसा है, तो आप IF क्लॉज का उपयोग करके अस्वीकृत मानों को शून्य (या कुछ अन्य विशेष मान) पर सेट कर सकते हैं, जैसे,
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 = '#'
बेशक, "विशेष मूल्य" एक समस्या हो सकती है, क्योंकि आपको एक ऐसे मूल्य की आवश्यकता होती है जो डेटा में कभी प्रकट नहीं होगा। यदि आपको शून्य के बीच का अंतर जानने की आवश्यकता है क्योंकि वास्तविक मूल्य शून्य बनाम शून्य है क्योंकि यह एक निषिद्ध कॉलम है तो आप शून्य का उपयोग नहीं कर सकते हैं।
एक और तरीका यह होगा कि आप परिणाम में दिखाई देने वाले प्रत्येक कॉलम के लिए विशेषाधिकार संकेतक शामिल करें, और अपने व्यावसायिक तर्क का उपयोग यह निर्धारित करने के लिए करें कि उपयोगकर्ता को कौन से मान दिखाई दे रहे हैं।
एक बहुत ही अलग दृष्टिकोण में परिणाम केवल अनुमत कॉलम रखने के लिए सेट होगा। इस मामले में आपको गतिशील रूप से अपना एसक्यूएल स्टेटमेंट बनाना होगा। मुझे नहीं पता कि आप इसे संग्रहीत प्रक्रिया में या होस्ट भाषा में कर रहे हैं, लेकिन मूल विचार कुछ इस तरह है:
string sqlCmd = "SELECT "
+ (SELECT (FIELDS_NAME_QUERY(UserID='#')
FROM USER_PRIVILEGES
WHERE userid='#')
+ FROM data d
execute sqlCmd
"निष्पादित करें" जिसका अर्थ है कि जो कुछ भी आपके पास एक स्ट्रिंग को sql कमांड के रूप में निष्पादित करने के लिए उपलब्ध है।
ओपी द्वारा स्पष्टीकरण के बाद:
ठीक है, आपको sql फ़ंक्शन की आवश्यकता है जो एक स्ट्रिंग देता है जो "colname1, colname2, ..." जैसा दिखता है। निम्नलिखित जैसा दिखता है वह sql सर्वर में कैसा दिखेगा। वाक्य रचना
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