संक्षिप्त उत्तर:अपने उपयोगकर्ताओं को डेटाबेस तक सीधे पहुंच न दें। उन्हें कभी भी कनेक्ट करने में सक्षम नहीं होना चाहिए। केवल रखरखाव और संचालन के लिए जिम्मेदार लोगों के पास उत्पादन डेटाबेस तक पहुंच होनी चाहिए। यह सुरक्षा कारणों से है। लगभग हर मामले में जहां जानकारी डेटाबेस में संग्रहीत होती है, वहां एक ऐसा एप्लिकेशन होता है जो सभी पहुंच को नियंत्रित करता है, यह वास्तविक अपडेट करने को संभालता है, और यह आपके द्वारा चुने गए व्यावसायिक तर्क को लागू करता है।
डेटा को व्यावसायिक तर्क के साथ न मिलाएं।
कुछ डेटाबेस सिस्टम हैं, जैसे कि Oracle जो आपके स्टोर को देने में उत्कृष्टता प्राप्त करता है और डेटाबेस के अंदर ही आपके अधिकांश व्यावसायिक तर्क को लागू करता है। हालांकि, यह एक अलग प्रकार के अनुप्रयोग के लिए है, और सिस्टम के निर्माण के लिए एक अलग दृष्टिकोण है।
इसे आसान बनाने के लिए MySQL के पास वे सभी उपकरण नहीं हैं। मुझ पर विश्वास करें जब मैं आपको बताता हूं कि आप एक रखरखाव दुःस्वप्न के लिए खुद को स्थापित कर रहे हैं यदि आप ट्रिगर्स और संग्रहीत प्रक्रियाओं और विचारों में अपना एप्लिकेशन तर्क लिखने का प्रयास करते हैं, तो अपने उपयोगकर्ताओं को डेटाबेस तक सीधे पहुंच प्रदान करें।
पिछली बार कब आपको किसी चीज़ के लिए साइन अप करते समय सीधे डेटाबेस एक्सेस दिया गया था? Twitter, Netflix, Groupon, Facebook -- आप एक वेब-आधारित एप्लिकेशन के साथ इंटरैक्ट कर रहे हैं जो व्यावसायिक नियमों को लागू करता है और आपकी ओर से डेटाबेस में डेटा पढ़ता और लिखता है।
बहुत सारे उपकरण हैं जो आपके एप्लिकेशन सॉफ़्टवेयर को लिखना आसान बनाते हैं:डिबगिंग, प्रोफाइलिंग, कोड के लिए स्रोत नियंत्रण और सहयोगी विकास, इकाई परीक्षण, निरंतर एकीकरण और परिनियोजन उपकरण। यदि आप डेटाबेस में सब कुछ लिखने का प्रयास करते हैं, तो आप वह सब खो देंगे।
यह कैसे काम करेगा इसका एक त्वरित उदाहरण यहां दिया गया है:
अपनी अनुमति प्रणाली को तीन तालिकाओं के रूप में संरचित करें:उपयोगकर्ता, समूह, उपयोगकर्ता_समूह। उपयोगकर्ता आपके सिस्टम में उपयोगकर्ता खाते रखता है, समूह पहुंच के विभिन्न स्तरों जैसे "व्यवस्थापक", "क्लाइंट", "अनाम", आदि रखता है। समूह हैं कि आप उपयोगकर्ताओं को एक्सेस स्तर कैसे निर्दिष्ट करते हैं।
`CREATE TABLE `user` (
`user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`email` varchar(64) NOT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `group` (
`group_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL,
PRIMARY KEY (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `user_group` (
`user_id` int(10) unsigned NOT NULL,
`group_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`user_id`,`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;`
अब कुछ समूहों को परिभाषित करने के लिए
`insert into `group` (name) values ('admin'), ('user'), ('anonymous');`
और एक उपयोगकर्ता, फिर उन्हें व्यवस्थापक समूह में जोड़ें:
`insert into user (email) values ('[email protected]');`
`insert into user_group (user_id,group_id) values (1,1);`
अब यह अनुमति मॉडल कहता है कि उपयोगकर्ता एक या अधिक सुरक्षा समूहों से संबंधित हो सकता है। आप आवेदन उन समूहों के लिए जाँच करेंगे और परिणामों के आधार पर विभिन्न कार्यों को करेंगे। आइए कुछ छद्म कोड देखें:
उपयोगकर्ता के समूह लोड करें:
class User {
private $user_id;
private $groups;
private $db;
function load_groups() {
// query the database
$result = $db->query("SELECT name FROM `group` g JOIN user_group ug USING (group_id) WHERE user_id={$this->user_id}");
// save an array of group names
while ($row = $result->fetchrow()) {
$this->groups[] = $row['name'];
}
}
function is_member($group) {
if (in_array($group, $this->groups) {
return true; // user group includes this value
}
return false; // user is not in the group
}
अब आपके आवेदन में, आपके पास डेटा देखने के लिए एक फ़ंक्शन हो सकता है, लेकिन यह उपयोगकर्ता के समूहों के आधार पर अलग-अलग परिणाम देगा:
function display_data($user_object) {
display_basic_data(); // everyone sees the basic data
if ($user_object->is_member('admin')) {
// if the user is an admin, then display bank data too
display_bank_data();
}
}
इसी तरह, डेटा को संशोधित करने के आपके कार्यों को यह सत्यापित करना चाहिए कि उपयोगकर्ताओं के पास चीजों को बदलने की अनुमति है।