নির্দিষ্ট কলামগুলিতে আপডেট সীমাবদ্ধ করুন। কেবলমাত্র সঞ্চিত প্রক্রিয়াটিকে সেই কলামগুলি আপডেট করার অনুমতি দিন


17

আমার কাছে সংবেদনশীল দামের কলাম রয়েছে যা আমি কেবল একটি সঞ্চিত পদ্ধতির মাধ্যমে আপডেট করতে চাই। আমি চাই যে সমস্ত কোড বা ম্যানুয়াল এই মূল্য কলামগুলিতে এটি আপডেট করার জন্য ডিজাইন করা সঞ্চিত পদ্ধতি ব্যবহার না করে ব্যর্থ হওয়ার জন্য মানগুলিকে পরিবর্তন করতে চেষ্টা করবে।

আমি ট্রিগার এবং একটি টোকেন টেবিল ব্যবহার করে এটি বাস্তবায়নের বিষয়ে বিবেচনা করছি। আমি যে ধারণাটি বিবেচনা করছি তা হ'ল একটি টোকেন টেবিল। সঞ্চিত পদ্ধতিগুলি প্রথমে টোকন সারণীতে মান সন্নিবেশ করতে হবে। তারপরে দাম কলামগুলি আপডেট করুন। আপডেট ট্রিগারটি টোকেনটি আপডেট করা সারির জন্য টোকেন টেবিলটিতে বিদ্যমান কিনা তা পরীক্ষা করবে। যদি পাওয়া যায় তবে তা অবিরত থাকবে। যদি টোকেনটি খুঁজে পাওয়া যায় না, এটি একটি ব্যতিক্রম ছুঁড়ে দেবে এবং আপডেট লেনদেনকে ব্যর্থ করে দেবে।

এই বিধিনিষেধ বাস্তবায়নের জন্য কি কোনও ভাল / আরও ভাল উপায় আছে?


1
কলাম ভিত্তিক সুরক্ষার জন্য আপনি একটি দর্শন ব্যবহার করতে পারেন। এটি ট্রিগারের চেয়ে অনেক বেশি মার্জিত হবে। ব্যবহারকারীদের ভিউতে অনুমতি দিন তবে অন্তর্নিহিত ডেটা নয়।
টমাস স্ট্রিংগার

এটি একটি ভাল পয়েন্ট। তবে সংযোগ পুলিং ব্যবহার করে এমন অনেকগুলি অ্যাপ্লিকেশন ভঙ্গ না করেই সমস্যাটি সমাধান হয়েছে।
ইলিয়াস

আপনি কীভাবে এটি ব্যাখ্যা করতে পারেন যে এটি "সংযোগ পুলিং ব্যবহার করে এমন অনেকগুলি অ্যাপ্লিকেশন ভাঙছে"?
অ্যারন বারট্র্যান্ড

উত্তর:


21

এসকিউএল সার্ভার কলাম-স্তরের অনুমতি দেয়। উদাহরণস্বরূপ:

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

ধন্যবাদ মাইকেল, তবে এই সমাধানটি আমার পক্ষে কার্যকর হবে না কারণ, আমার অ্যাপ্লিকেশনটি একটি ওয়েব অ্যাপ্লিকেশন যা সংযোগ পুলিং ব্যবহার করছে। সমস্ত ব্যবহারকারী একই এসকিউএল সার্ভার সংযোগ স্ট্রিং ব্যবহার করে সংযুক্ত হন।
ইলিয়াস

1
@ ইলিয়াস আমি বুঝতে পারছি না সংযোগের স্ট্রিংটি কোনও নির্দিষ্ট ব্যবহারকারীর সাথে সংযোগ স্থাপন করে, তাই না? সুতরাং SampleRoleসেই ব্যবহারকারীর সাথে প্রতিস্থাপন করুন ...
অ্যারন বারট্রান্ড

কলাম স্তরের অনুমতিগুলি এখানে যাওয়ার উপায়। এটি এবং এটি নিশ্চিত করে যে বিকাশকারীরা জানেন যে টি-স্কুএল-এর মাধ্যমে মানগুলিতে পরিবর্তন করা সিস্টেমকে ধ্বংস করবে।
mrdenny

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

আপনার সমস্ত ব্যবহারকারীর যদি একই লগইন থাকে (আউচ, বিটিডাব্লু) তবে এখানে অন্য বিকল্প রয়েছে

  • সেই ব্যবহারকারীর আপডেট আপডেটগুলি প্রত্যাহার করুন (বা ভূমিকা, যদি আপনি এটি সেভাবে করছেন)।
  • এতে "মালিক হিসাবে নির্বাহ করুন" এর ধারাটি দিয়ে সঞ্চিত সংগ্রহটি পরিবর্তন করুন
  • তারপরে সঞ্চিত প্রকল্পটি ব্যবহারকারীর অধিকারের সাথে চলবে যার স্কিমা যেখানে এটিতে থাকে তার মালিকানা (যদি এটি এর মধ্যে থাকে dboতবে আপনি ইতিমধ্যে আচ্ছাদিত হয়ে আছেন)।

নিয়মিত অ্যাপ্লিকেশন ব্যবহারকারীদের সেই টেবিলটিতে আপডেটের অধিকারের অভাব থাকবে, সুতরাং তারা এটিকে অন্য কোনও উপায়ে আপডেট করতে অক্ষম হবে।


এটি করার জন্য আপনার নতুন ব্যবহারকারী তৈরি করার দরকার নেই ...
অ্যারন বারট্রান্ড

@ অ্যারোনবার্টেন্ড আপনি ঠিক বলেছেন - তাই, ই যুক্তি ভাবছিল যে আপনি "স্রষ্টা হিসাবে মৃত্যুদন্ড কার্যকর করবেন", তবে এটি কোনও জিনিস নয় - আপনি যতক্ষণ না স্কিমার মালিকানাধীন ব্যবহারকারীর অধিকার রয়েছে ততক্ষণ আপনি "মালিক হিসাবে মৃত্যুদন্ড কার্যকর" করতে পারবেন টেবিল আপডেট করুন। যদি সঞ্চিত প্রোকটি ডিবিওতে থাকে তবে আপনি আচ্ছাদিত। আমি আমার উত্তর আপডেট করব।
SqlRyan
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.