कुछ स्तंभों पर अद्यतन प्रतिबंधित करें। केवल उन स्तंभों को अद्यतन करने के लिए संग्रहीत कार्यविधि की अनुमति दें


17

मेरे पास संवेदनशील मूल्य कॉलम हैं जिन्हें मैं केवल एक संग्रहीत प्रक्रिया के माध्यम से अपडेट करना चाहता हूं। मैं सभी कोड या मैन्युअल प्रयासों को इन मूल्य स्तंभों में मानों को बदलने का प्रयास करना चाहता हूं यदि यह इसे अपडेट करने के लिए डिज़ाइन की गई संग्रहीत प्रक्रियाओं का उपयोग नहीं कर रहा है।

मैं इसे ट्रिगर और एक टोकन तालिका का उपयोग करके लागू करने पर विचार कर रहा हूं। मैं जिस विचार पर विचार कर रहा हूं वह एक टोकन तालिका है। संग्रहीत प्रक्रियाओं को टोकन तालिका में पहले मान सम्मिलित करना होगा। फिर मूल्य कॉलम अपडेट करें। अद्यतन ट्रिगर जाँच करेगा कि टोकन अद्यतन पंक्ति के लिए टोकन तालिका में मौजूद है या नहीं। अगर मिला, तो यह जारी रहेगा। यदि टोकन नहीं मिला है, तो यह एक अपवाद फेंक देगा और अपडेट लेनदेन को विफल कर देगा।

क्या इस प्रतिबंध को लागू करने का एक अच्छा / बेहतर तरीका है?


1
आप कॉलम आधारित सुरक्षा के लिए एक दृश्य का उपयोग कर सकते हैं। यह एक ट्रिगर की तुलना में बहुत अधिक सुरुचिपूर्ण होगा। उपयोगकर्ताओं को दृश्य पर अनुमति दें लेकिन अंतर्निहित डेटा नहीं।
थॉमस स्ट्रिंगर

यह एक अच्छी बात है। लेकिन कनेक्शन पूलिंग का उपयोग करने वाले बहुत सारे अनुप्रयोगों को तोड़ने के बिना समस्या बनी हुई है।
एलियास

क्या आप समझा सकते हैं कि यह "कनेक्शन पूलिंग का उपयोग करने वाले बहुत सारे अनुप्रयोगों को कैसे तोड़ देगा"?
हारून बर्ट्रेंड

जवाबों:


21

SQL सर्वर कॉलम-स्तर की अनुमति देता है। सिर्फ उदाहरण के लिए:

GRANT UPDATE ON dbo.Person (FirstName, LastName) TO SampleRole;
DENY UPDATE ON dbo.Person (Age, Salary) TO SampleRole;

धन्यवाद मिशाल, लेकिन यह समाधान मेरे लिए काम नहीं करेगा क्योंकि, मेरा आवेदन एक वेब अनुप्रयोग है जो कनेक्शन पूलिंग का उपयोग कर रहा है। सभी उपयोगकर्ता एक ही SQL सर्वर कनेक्शन स्ट्रिंग का उपयोग करके कनेक्ट होते हैं।
एलियास

1
@ एलियास मुझे समझ में नहीं आता है। कनेक्शन स्ट्रिंग एक विशिष्ट उपयोगकर्ता के रूप में जोड़ता है, है ना? तो की जगह SampleRoleहै कि उपयोगकर्ता के साथ ...
हारून बर्ट्रेंड

स्तंभ स्तर अनुमतियाँ यहाँ जाने का रास्ता हैं। यह सुनिश्चित करने और सुनिश्चित करने के लिए कि डेवलपर्स जानते हैं कि टी-एसक्यूएल के माध्यम से मूल्यों में सीधे बदलाव करना सिस्टम को नष्ट कर देगा।
मर्डेनी

6
-- prevent your web app user from updating that column directly:

DENY UPDATE ON dbo.YourTable(Price) TO WebApplicationUserName;
GO

-- create a stored procedure while logged in as sysadmin:

CREATE PROCEDURE dbo.UpdateYourTable
  @ProductID INT,
  @Price DECIMAL(10,2)
WITH EXECUTE AS OWNER
AS
BEGIN
  SET NOCOUNT ON;

  UPDATE dbo.YourTable 
    SET Price = @Price
    WHERE ProductID = @ProductID;
END
GO

-- grant explicit access only to that stored procedure to the web app user:

GRANT EXEC ON dbo.UpdateYourTable TO WebApplicationUserName;

2

यदि आपके सभी उपयोगकर्ताओं के पास एक ही लॉगिन (ouch, BTW) है तो यहां एक और विकल्प है

  • उस उपयोगकर्ता (या भूमिका, यदि आप इसे इस तरह से कर रहे हैं) से अपडेट अधिकार रद्द करें।
  • उस पर "निष्पादित के रूप में मालिक" खंड के साथ संग्रहीत खरीद को बदल दें
  • फिर संग्रहीत खरीद उपयोगकर्ता के अधिकारों के साथ चलेगी, जो स्कीमा का मालिक है जिसमें वह रहता है (यदि इसके dboबाद, तो आप पहले से ही कवर हैं)।

नियमित एप्लिकेशन उपयोगकर्ताओं को उस तालिका के अपडेट अधिकारों की कमी होगी, इसलिए वे इसे किसी अन्य तरीके से अपडेट करने में असमर्थ होंगे।


ऐसा करने के लिए एक नया उपयोगकर्ता बनाने की जरूरत नहीं है ...
हारून बर्ट्रेंड

@ARonbertrand आप सही कह रहे हैं - इसलिए, e reasonni सोच रहा था कि आप "निर्माता के रूप में निष्पादित" करेंगे, लेकिन यह कोई बात नहीं है - आप तब तक "स्वामी के रूप में निष्पादित" कर सकते हैं जब तक कि उपयोगकर्ता के पास स्कीमा का अधिकार है उस तालिका को अपडेट करें। यदि संग्रहित खरीद dbo में है, तो आप कवर किए गए हैं। मैं अपना जवाब अपडेट करूंगा।
SqlRyan
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.