DEFINER होस्ट मिसमैच समस्या हल करना
जब स्टोर्ड प्रोसीजर का DEFINER किसी ऐसे यूज़र/होस्ट कॉम्बिनेशन पर सेट हो जो मौजूद नहीं है, तो "The user specified as a definer does not exist" एरर आता है।
समस्या समझना
DEFINER में `user@host` होना चाहिए जो mysql.user टेबल में मौजूद हो।
मौजूदा यूज़र/होस्ट जांचना
mysql> SELECT user, host FROM mysql.user;
+------------------+-----------+ | user | host | +------------------+-----------+ | Bob | % | | User2 | % | | mysql.infoschema | % | | mysql.session | % | | mysql.sys | % | | root | % | | @UserName@ | localhost | | Adam Smith | localhost | | David | localhost | | James | localhost | | John | localhost | | John Doe | localhost | | User1 | localhost | | am | localhost | | hbstudent | localhost | | mysql.infoschema | localhost | | mysql.session | localhost | +------------------+-----------+ 17 rows in set (0.00 sec)
सही DEFINER के साथ प्रोसीजर बनाना
उपरोक्त आउटपुट में 'Bob'@'%' मौजूद है, इसलिए:
mysql> DELIMITER //
mysql> CREATE DEFINER=`Bob`@`%` PROCEDURE `Message`()
BEGIN
SELECT "Hello World";
END //
Query OK, 0 rows affected (0.14 sec)
mysql> DELIMITER ;
प्रोसीजर कॉल करना
mysql> CALL `Message`();
+-------------+ | Hello World | +-------------+ | Hello World | +-------------+ 1 row in set (0.00 sec)
सामान्य समस्याएं और समाधान
1. DEFINER यूज़र मौजूद नहीं है
-- मौजूदा यूज़र के साथ बनाएं CREATE DEFINER=`existing_user`@`%` PROCEDURE ...
2. लोकलहोस्ट vs % मिसमैच
-- यदि यूज़र केवल localhost पर है CREATE DEFINER=`user`@`localhost` PROCEDURE ... -- यदि यूज़र % (किसी भी होस्ट) पर है CREATE DEFINER=`user`@`%` PROCEDURE ...
3. मौजूदा प्रोसीजर का DEFINER बदलना
ALTER PROCEDURE `Message` DEFINER = `Bob`@`%`;
4. रूट के लिए दोनों होस्ट बनाना
CREATE USER 'root'@'localhost' IDENTIFIED BY 'password'; CREATE USER 'root'@'%' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;
सर्वोत्तम अभ्यास
- DEFINER को स्पष्ट रूप से न 지정ें - डिफ़ॉल्ट (CURRENT_USER) उपयोग करें
- CREATE PROCEDURE बिना DEFINER के लिखें
- यदि निर्दिष्ट करना हो, तो mysql.user में मौजूद सटीक user@host उपयोग करें
- माइग्रेशन के बाद DEFINER अपडेट करें:
UPDATE mysql.proc SET definer='user@host' WHERE db='dbname';
SQL SECURITY विशेषता
CREATE PROCEDURE `Message`()
SQL SECURITY INVOKER -- कॉलर के विशेषाधिकार उपयोग करें
BEGIN
SELECT "Hello World";
END
SQL SECURITY DEFINER(डिफ़ॉल्ट): DEFINER के विशेषाधिकार से चलता हैSQL SECURITY INVOKER: कॉल करने वाले के विशेषाधिकार से चलता है