Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> MySQL

MySQL स्टोर्ड प्रोसीजर में DEFINER=`root`@`%` लोकलहोस्ट पर काम नहीं कर रहा?

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: कॉल करने वाले के विशेषाधिकार से चलता है
  1. - MySQL स्टोर्ड प्रोसीजर में WHERE IN() क्लॉज का उपयोग कैसे करें?

    MySQL स्टोर्ड प्रोसीजर में डायनामिक WHERE IN() क्लॉज का उपयोग करने के लिए प्रिपेयर्ड स्टेटमेंट (Prepared Statements) का उपयोग करना पड़ता है, क्योंकि IN क्लॉज में सीधे पैरामीटर पास नहीं किया जा सकता। समस्या सीधे पैरामीटर उपयोग नहीं कर सकते: -- यह काम नहीं करेगा: SELECT * FROM table WHERE id IN (inpu

  1. - MySQL स्टोर्ड प्रोसीजर में गणितीय संक्रियाएं करें?

    आइए एक स्टोर्ड प्रोसीजर बनाते हैं। यहाँ हम amount*quantity की गणना कर रहे हैं यानी गणितीय संक्रियाएं लागू कर रहे हैं: mysql> delimiter // mysql> create procedure calculation_proc(amount int,quantity int) begin select amount,quantity,(amount*quantity) as Total; end // Query OK, 0 rows affe

  1. - MySQL स्टोर्ड प्रोसीजर में टेबल में डेटा कैसे इन्सर्ट करें?

    MySQL स्टोर्ड प्रोसीजर के अंदर INSERT स्टेटमेंट का उपयोग करके टेबल में डेटा इन्सर्ट कर सकते हैं। पैरामीटर लेकर डायनामिक इन्सर्ट करने वाला प्रोसीजर पुन: उपयोग योग्य और सुरक्षित होता है। सिंटैक्स CREATE PROCEDURE procedure_name(IN param1 TYPE, IN param2 TYPE, ...) BEGIN INSERT INTO table_name (co