If you're seeing this message, it means we're having trouble loading external resources on our website.

তোমার যদি কোন ওয়েব ফিল্টার দেওয়া থাকে, তাহলে দয়া করে নিশ্চিত কর যে *.kastatic.org এবং *.kasandbox.org ডোমেইনগুলো উন্মুক্ত।

মূল বিষয়বস্তু

SQL (এসকিউএল) এর নিরাপত্তা নিশ্চিত করা

SQL (এসকিউএল) একটি মজার বিষয়, কিন্তু এটি ভয়ানকও হতে পারে। একটি অ্যাপের ডেটাবেজের জন্য যদি SQL ব্যবহার করা হয় যার ব্যবহারকারী সংখ্যা হাজার অথবা লাখ অথবা কোটি কোটি, সেক্ষেত্রে সতর্ক হতে হবে - কারণ যে কোন সময় ভুলবশত ডেটাবেজ নষ্ট হতে বা মুছে যেতে পারে। চিন্তার কারণ নেই, SQL কে নিরাপদ রাখার বেশ কয়েকটি উপায় আছে।

ত্রুটিপূর্ণ আপডেট/মুছে ফেলা এড়িয়ে চলা

UPDATE করার আগে, সঠিক সারি আপডেট করছেন কিনা যাচাইয়ের জন্য একই WHERE দিয়ে একটি SELECT চালক চালানো উচিত।
উদাহরণস্বরূপ, এই কোড চালানোর আগে:
UPDATE users SET deleted = true WHERE id = 1;
চালানো উচিত:
SELECT id, deleted FROM users WHERE id = 1;
আপডেট করার জন্য করার জন্য প্রস্তুত হলে, LIMIT ব্যবহার করা উচিত যেন অতিরিক্ত সারি আপডেট না হয়:
UPDATE users SET deleted = true WHERE id = 1 LIMIT 1;
অথবা মুছে ফেলার সময়:
DELETE users WHERE id = 1 LIMIT 1;

ট্রান্স্যাকশনের (Transaction) ব্যবহার

ডেটাবেজ পরিবর্তনের জন্য যখন একটি SQL কমান্ড ব্যবহার করা হয়, এটি একটি কার্যক্রম শুরু করে যাকে "ট্রান্স্যাকশন" বলা হয়। ট্রান্স্যাকশন হল কয়েকটি ধাপে একটি কমান্ড চালনা হওয়া যেন সমগ্র পদ্ধতিটিকে একটি লজিক হিসেবে ব্যবহার করা যায় (যেমন ব্যাংকের লেনদেন) এবং ডেটাবেজের ক্ষেত্রে, একটি ট্রান্স্যাকশনকে অবশ্যই "ACID"এর সূত্রগুলো মেনে চলতে হবে।
আমরা যখনই CREATE, UPDATE, INSERT অথবা DELETE কমান্ড চালাই তখনই ট্রান্স্যাকশন চালু হয়। কিন্তু, আমরা চাইলে, একাধিক কমান্ডকে একটি বড় ট্রান্স্যাকশনের অন্তর্ভুক্ত করতে পারি। এরকমও হতে পারে যে, একটি UPDATE কাজ করার পর আমরা আরেকটি UPDATE চালাতে চাই, এজন্য দুইটি আপডেটকেই ট্রান্স্যাকশনের মধ্যে লিখতে হয়।
এক্ষেত্রে, আমরা কমান্ডকে BEGIN TRANSACTION এবং COMMIT এর মধ্যে লিখতে পারি:
BEGIN TRANSACTION;
UPDATE people SET husband = "Winston" WHERE user_id = 1;
UPDATE people SET wife = "Winnefer" WHERE user_id = 2;
COMMIT;
যদি ডেটাবেজে কোন কারণে UPDATE কাজ না করে, তাহলে এটি ট্রান্স্যাকশনকে ফেরত নেবে এবং ডেটাবেজটি আগের মতই থাকবে।
সকল কমান্ড ব্যবহারের জন্য একই ডেটাবেজের ডাটা ট্র্যানজেকশন প্রয়োজনীয় - এছাড়াও ট্র্যানজেকশনটি শেষ না হওয়া পর্যন্ত অন্য কোন কমান্ড যেন কার্যকর না হয় তা ট্র্যানজেকশন নিশ্চিত করে। কমান্ড চালনার সময় প্রশ্ন আসতে পারে যে, আরেকজন যদি একই সময়ে একই কমান্ড দেয় তাহলে কি হবে। উপাত্তগুলো কি নষ্ট হয়ে যেতে পারে? এসব ক্ষেত্রে, অবশ্যই ট্রান্স্যাকশন ব্যবহার করতে হবে।
উদাহরণস্বরূপ, কোন ব্যবহারকারী একটি ব্যাজ পেলে নিচের কমান্ড দিয়ে একটি সারি তৈরি করে, তারপর ব্যবহারকারীর বর্তমান কার্যক্রম আপডেট করে:
INSERT INTO user_badges VALUES (1, "SQL Master", "4pm");
UPDATE user SET recent_activity = "Earned SQL Master badge" WHERE id = 1;
একই সময়ে, আরেকটি পদ্ধতিতে ব্যবহারকারী আরেকটি ব্যাজ পেতে পারেন:
INSERT INTO user_badges VALUES (1, "Great Listener", "4:05pm");
UPDATE user SET recent_activity = "Earned Great Listener badge" WHERE id = 1;
এই কমান্ডগুলোকে এভাবে ব্যবহার করা যায়:
INSERT INTO user_badges VALUES (1, "SQL Master");
INSERT INTO user_badges VALUES (1, "Great Listener");
UPDATE user SET recent_activity = "Earned Great Listener badge" WHERE id = 1;
UPDATE user SET recent_activity = "Earned SQL Master badge" WHERE id = 1;
তাদের বর্তমান কার্যক্রমে এখন "SQL মাস্টার ব্যাজ অর্জিত" দেখাবে, যদিও কিছু সময় আগেই তা ছিল "দারুণ শ্রোতা" ব্যাজ। এটা আসলে কোন ব্যাপার নয়, কিন্তু আমরা আশানরুপ ফল পাই নাই।
পরিবর্তে, অন্য কোন কমান্ড যেন চলমান ট্র্যান্স্যাকশনের মধ্যে না চলে সেটা আমরা ট্র্যান্স্যাকশন ব্যবহার করে নিশ্চিত করতে পারি:
BEGIN TRANSACTION;
INSERT INTO user_badges VALUES (1, "SQL Master");
UPDATE user SET recent_activity = "Earned SQL Master badge" WHERE id = 1;
COMMIT;

সংরক্ষণ করা

উপরের পরামর্শগুলো অনুসরণ করা আবশ্যক, কিন্তু কিছু সময় অনাকাঙ্ক্ষিতভাবে ভুল হয়ে যেতে পারে। এজন্যই বেশিরভাগ কোম্পানি তাদের ডেটাবেজ সংরক্ষণ করে রাখে - ডেটাবেজটি কত বড় তার উপর ভিত্তি করে প্রতি ঘণ্টায় অথবা দৈনিক বা সাপ্তাহিকভাবে সংরক্ষণ করা হয়। যখন কোন ডাটায় ত্রুটি হয়, সংরক্ষিত ডেটাবেজ থেকে সেই ডাটাকে ফেরত নিয়ে আসা হয়। ডাটাটি পুরান হলেও, কোন ডাটার না থাকার চেয়ে পুরান ডাটা থাকাই ভালো।

প্রতিলিপি

আরেকটি গুরুত্বপূর্ণ ব্যাপার হল প্রতিলিপি করা - ডেটাবেজের একাধিক প্রতিলিপিকে বিভিন্ন স্থানে সংরক্ষণ করা। যদি কোন কারণে ডেটাবেজের একটি নির্দিষ্ট প্রতিলিপিকে না পাওয়া যায় (ডেটাবেজ বিদ্যুৎপৃষ্ঠ হলে, এমনটি আমার হয়েছিল!), তাহলে আমরা অন্য স্থানে রাখা ডেটাবেজের প্রতিলিপিতে কমান্ড পাঠাতে পারি। যদি ডাটা খুবই গুরুত্বপূর্ণ হয়, তাহলে অবশ্যই এর প্রতিলিপি করা উচিত। উদাহরণস্বরূপ, জরুরি অবস্থায় একজন ডাক্তারের চিকিৎসার জন্য রোগীদের এলার্জির ডাটা দরকার যা বর্তমানে ডেটাবেজে নেই, কিন্তু ডেটাবেজ পুনরুদ্ধার করে ডাটা নেওয়ার সময় নেই, তাদের এখনই দরকার, এক্ষেত্রে সংরক্ষিত ডেটাবেজ খুবই উপকারি।
কিন্তু, ডেটাবেজের প্রতিলিপি তৈরি করা একটি বিশাল কাজ এবং সবগুলো ডেটাবেজে একই কমান্ড চলার কারণে কর্মদক্ষতা অনেক কমে যায়। এজন্য একটি কোম্পানিকে তাদের পরিবেশ এবং আর্থিক পরিস্থিতির কথা বিবেচনা করে প্রয়োজন মোতাবেক ডেটাবেজের প্রতিলিপি করে সংরক্ষণের সিদ্ধান্ত নিতে হবে।

অধিকারের অনুমতিসমূহ

অনেক ডেটাবেজ ব্যবস্থারই নিজেস্ব ব্যবহারকারী এবং অধিকার আছে, কারণ তাদেরকে একটি সার্ভারে রাখা হয় এবং অনেকেই এটা ব্যবহার করে থাকে। কিন্তু খান একাডেমির SQL স্ক্রিপ্টগুলোতে ব্যবহারকারীর অধিকারের কোন বিষয় নেই, কারণ সাধারণত SQLite (এসকিউলাইট) এ একজন ব্যবহারকারী থাকে এবং এটা ব্যবহার করা অনেক সহজ।
কিন্তু কোন সার্ভারের অংশ হিসেবে ডেটাবেজ ব্যবস্থা নিয়ে কাজ করলে খেয়াল রাখতে হবে, যেন ব্যবহারকারী এবং তাদের অধিকারসমূহ ঠিক করে দেওয়া হয়। সাধারণ নিয়মানুসারে, শুধুমাত্র কয়েকজন ব্যবহারকারীই ডেটাবেজে ঢুকতে পারে (যেমন ব্যাক-এন্ড ইঞ্জিনিয়ার), কারণ সকলের জন্য ব্যবহার করা বিপদজনক হতে পারে।
উদাহরণস্বরূপ, এখানে আমরা একজন ব্যবহারকারীকে ডেটাবেজের সকল অধিকার দিয়েছি:
GRANT FULL ON TABLE users TO super_admin;
এবং এখানে, আরেকজন ব্যবহারকারীকে আমরা কিছু SELECT অধিকারের অনুমতিসমূহ দিয়েছি:
GRANT FULL ON TABLE users TO super_admin;
বড় কোম্পানিতে, বেশিরভাগ ক্ষেত্রেই ব্যবহারকারীকে SELECT এর অধিকার দেওয়া হয় না, কারণ ডেটাবেজে ব্যক্তিগত বিষয় থাকে, যেমন একজন ব্যবহারকারীর ই-মেইল বা নাম। এজন্য অনেক কোম্পানি ব্যক্তিগত তথ্যকে নিরাপদ রাখার জন্য অপ্রকাশিত নামের ডেটাবেজ রাখে।
আরও জানার জন্য: এসকিউএলের নিরাপত্তা সম্পর্কে এই বিখ্যাত XKCD comic (কার্টুন) পড়ুন (সাথে এটির ব্যাখ্যা)।

আলোচনায় অংশ নিতে চাও?

কোন আলাপচারিতা নেই।
ইংরেজি জানো? খান একাডেমির ইংরেজি সাইটে আরো আলোচনা দেখতে এখানে ক্লিক কর।