Home Database Mysql Tutorial MySQL用户执行存储过程的权限

MySQL用户执行存储过程的权限

Jun 07, 2016 pm 04:19 PM
mysql storage implement Permissions user process

MySQL中以用户执行存储过程的权限为EXECUTE 比如我们在名为configdb的数据库下创建了如下存储过程,存储过程的定义者为user_admin use configdb; drop procedure if exists sp_dev_test_user_add; delimiter $$ CREATE DEFINER=`user_admin`@`%` PROCEDURE `s

   MySQL中以用户执行存储过程的权限为EXECUTE

  比如我们在名为configdb的数据库下创建了如下存储过程,存储过程的定义者为user_admin

  use configdb;

  drop procedure if exists sp_dev_test_user_add;

  delimiter $$

  CREATE DEFINER=`user_admin`@`%` PROCEDURE `sp_dev_test_user_add`(

  in var_user varchar(30),

  in var_ip varchar(15),

  in var_username varchar(30),

  in var_email varchar(30),

  in var_orginfo varchar(30)

  )

  BEGIN

  create temporary table errors (error varchar(500));

  if exists ( select user from mysql.user where user=var_user) then

  insert into errors values (concat('用户名 "',var_user,'" 已存在!'));

  end if;

  if exists (select * from errors) then

  select error from errors;

  else

  set @user=concat(var_user,'@'',var_ip,''');

  set @s=concat('create user ',@user,' identified by ''12345'';');

  prepare cmd from @s;

  execute cmd;

  set @s=concat('GRANT SELECT ON `mysql`.`func` TO ',@user,';');

  prepare cmd from @s;

  execute cmd;

  set @s=concat('GRANT SELECT ON `mysql`.`proc` TO ',@user,';');

  prepare cmd from @s;

  execute cmd;

  replace into dev_test_userinfo values (var_user,var_username,var_email,var_orginfo);

  end if;

  drop temporary table errors;

  END

  $$

  delimiter ;

  试着创建一个普通用户user_test1

  mysql>create user user_test1 identified by '12345';

  查看其权限

  mysql>show grants for user_test1;

  +-----------------------------------------------------------------------------------------------------------+

  | Grants for user_test1@% |

  +-----------------------------------------------------------------------------------------------------------+

  | GRANT USAGE ON *.* TO 'user_test1'@'%' IDENTIFIED BY PASSWORD '*00A51F3F48415C7D4E8908980D443C29C69B60C9' |

  +-----------------------------------------------------------------------------------------------------------+

  赋予其configdb上的selectinsertdeleteupdate权限

  mysql>grant select,insert,delete,update on configdb.* to 'user_test1'@'%' IDENTIFIED BY PASSWORD '*00A51F3F48415C7D4E8908980D443C29C69B60C9'

  mysql> show grants for user_test1;

  +-----------------------------------------------------------------------------------------------------------+

  | Grants for user_test1@% |

  +-----------------------------------------------------------------------------------------------------------+

  | GRANT USAGE ON *.* TO 'user_test1'@'%' IDENTIFIED BY PASSWORD '*00A51F3F48415C7D4E8908980D443C29C69B60C9' |

  | GRANT SELECT, INSERT, UPDATE, DELETE ON `configdb`.* TO 'user_test1'@'%' |

  +-----------------------------------------------------------------------------------------------------------+

  使用此用户登录MySQL执行刚才定义的存储过程

  mysql>use configdb;

  mysql>call sp_dev_test_user_add('uapp_yzz','172.16.%','yzz','yzz@email','MySQL DBA');

  ERROR 1370 (42000): execute command denied to user 'user_test1'@'%' for routine 'configdb.sp_dev_test_user_add'

  看来是权限不足,继续赋予其configdb上的execute权限

  mysql> grant execute on configdb.* to 'user_test1'@'%' IDENTIFIED BY PASSWORD '*00A51F3F48415C7D4E8908980D443C29C69B60C9';

  mysql> show grants for user_test1;

  +-----------------------------------------------------------------------------------------------------------+

  | Grants for user_test1@% |

  +-----------------------------------------------------------------------------------------------------------+

  | GRANT USAGE ON *.* TO 'user_test1'@'%' IDENTIFIED BY PASSWORD '*00A51F3F48415C7D4E8908980D443C29C69B60C9' |

  | GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `configdb`.* TO 'user_test1'@'%' |

  +-----------------------------------------------------------------------------------------------------------+

  重新使用此用户登录MySQL执行刚才定义的存储过程

  mysql>use configdb;

  mysql>call sp_dev_test_user_add('uapp_yzz','172.16.%','yzz','yzz@email','MySQL DBA');

  ERROR 1449 (HY000): The user specified as a definer ('user_admin'@'%') does not exist

  这次可以调用该存储过程了,但是提示存储过程定义中的definer不存在,原来仅仅是连接到MySQL服务器的用户具有执行存储过程的权限是远远不够的,最终要通过存储过程定义中指定的definer来执行存储过程。

  创建user_admin'@'%'这个用户,并赋予configdb上相应的权限

  mysql>create user user_admin identified by '12345';

  mysql> grant select,insert,delete,update on configdb.* to 'user_admin'@'%' IDENTIFIED BY PASSWORD '*00A51F3F48415C7D4E8908980D443C29C69B60C9';

  mysql> show grants for user_admin;

  +-----------------------------------------------------------------------------------------------------------+

  | Grants for user_admin@% |

  +-----------------------------------------------------------------------------------------------------------+

  | GRANT USAGE ON *.* TO 'user_admin'@'%' IDENTIFIED BY PASSWORD '*00A51F3F48415C7D4E8908980D443C29C69B60C9' |

  | GRANT SELECT, INSERT, UPDATE, DELETE ON `configdb`.* TO 'user_admin'@'%' |

  +-----------------------------------------------------------------------------------------------------------+

  重新使用'user_test1'@'%'用户登录MySQL执行刚才定义的存储过程

  mysql>use configdb;

  mysql> call sp_dev_test_user_add('uapp_yzz','172.16.%','yzz','yzz@email','MySQL DBA');

  ERROR 1370 (42000): execute command denied to user 'user_admin'@'%' for routine 'configdb.sp_dev_test_user_add'

  看来不仅仅是连接到MySQL服务器的用户需要具有存储过程上的执行权限,存储过程定义者同样需要该权限。

  mysql> grant execute on configdb.* to 'user_admin'@'%' IDENTIFIED BY PASSWORD '*00A51F3F48415C7D4E8908980D443C29C69B60C9';

  mysql> show grants for user_admin;

  +-----------------------------------------------------------------------------------------------------------+

  | Grants for user_admin@% |

  +-----------------------------------------------------------------------------------------------------------+

  | GRANT USAGE ON *.* TO 'user_admin'@'%' IDENTIFIED BY PASSWORD '*00A51F3F48415C7D4E8908980D443C29C69B60C9' |

  | GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `configdb`.* TO 'user_admin'@'%' |

  +-----------------------------------------------------------------------------------------------------------+

  重新使用'user_test1'@'%'用户登录MySQL执行刚才定义的存储过程

  mysql>use configdb;

  mysql> call sp_dev_test_user_add('uapp_yzz','172.16.%','yzz','yzz@email','MySQL DBA');

  ERROR 1044 (42000): Access denied for user 'user_admin'@'%' to database 'configdb'

  可以执行存储过程了,但是提示权限不足,仔细查看存储过程的定义可以看到,存储过程中包含创建用户和赋予权限的语句,而我们赋给'user_test1'@'%'用户和'user_admin'@'%'都不具有这样的权限。

  赋予'user_test1'@'%'创建用户的权限和赋权的权限,以及创建临时表的权限

  mysql> grant create user on *.* to 'user_test1'@'%' IDENTIFIED BY PASSWORD '*00A51F3F48415C7D4E8908980D443C29C69B60C9' with grant option;

  mysql> grant create temporary tables on configdb.* to 'user_test1'@'%' IDENTIFIED BY PASSWORD '*00A51F3F48415C7D4E8908980D443C29C69B60C9';

  mysql> show grants for 'user_test1'@'%';

  +-----------------------------------------------------------------------------------------------------------------------------------+

  | Grants for user_test1@% |

  +-----------------------------------------------------------------------------------------------------------------------------------+

  | GRANT CREATE USER ON *.* TO 'user_test1'@'%' IDENTIFIED BY PASSWORD '*00A51F3F48415C7D4E8908980D443C29C69B60C9' WITH GRANT OPTION |

  | GRANT SELECT, INSERT, UPDATE, DELETE, CREATE TEMPORARY TABLES, EXECUTE ON `configdb`.* TO 'user_test1'@'%' |

  +-----------------------------------------------------------------------------------------------------------------------------------+

  重新使用'user_test1'@'%'用户登录MySQL执行刚才定义的存储过程

  mysql>use configdb;

  mysql> call sp_dev_test_user_add('uapp_yzz','172.16.%','yzz','yzz@email','MySQL DBA');

  ERROR 1044 (42000): Access denied for user 'user_admin'@'%' to database 'configdb'

  对了,不管你是以什么账户登录的MySQL,最后是使用存储过程的definer执行存储过程的,所以应当把创建用户和赋权的权限付给definer,这里为user_admin'@'%'这个账户。

  赋予'user_admin'@'%'创建用户的权限和赋权的权限

  mysql> grant create user on *.* to 'user_admin'@'%' IDENTIFIED BY PASSWORD '*00A51F3F48415C7D4E8908980D443C29C69B60C9' with grant option;

  mysql> grant create temporary tables on configdb.* to 'user_admin'@'%' IDENTIFIED BY PASSWORD '*00A51F3F48415C7D4E8908980D443C29C69B60C9';

  mysql> show grants for 'user_admin'@'%';

  +-----------------------------------------------------------------------------------------------------------------------------------+

  | Grants for user_admin@% |

  +-----------------------------------------------------------------------------------------------------------------------------------+

  | GRANT CREATE USER ON *.* TO 'user_admin'@'%' IDENTIFIED BY PASSWORD '*00A51F3F48415C7D4E8908980D443C29C69B60C9' WITH GRANT OPTION |

  | GRANT SELECT, INSERT, UPDATE, DELETE, CREATE TEMPORARY TABLES, EXECUTE ON `configdb`.* TO 'user_admin'@'%' |

  +-----------------------------------------------------------------------------------------------------------------------------------+

  重新使用'user_test1'@'%'用户登录MySQL执行刚才定义的存储过程

  mysql>use configdb;

  mysql> call sp_dev_test_user_add('uapp_yzz','172.16.%','yzz','yzz@email','MySQL DBA');

  ERROR 1142 (42000): SELECT command denied to user 'user_admin'@'%' for table 'user'

  哦,除了configdb库外还得有mysql库上user表的权限,给加上,看来权限问题还真是棘手,呵呵~

  mysql> grant select,insert,delete,update on mysql.* to 'user_admin'@'%' IDENTIFIED BY PASSWORD '*00A51F3F48415C7D4E8908980D443C29C69B60C9';

  mysql> show grants for 'user_admin'@'%';

  +-----------------------------------------------------------------------------------------------------------------------------------+

  | Grants for user_admin@% |

  +-----------------------------------------------------------------------------------------------------------------------------------+

  | GRANT CREATE USER ON *.* TO 'user_admin'@'%' IDENTIFIED BY PASSWORD '*00A51F3F48415C7D4E8908980D443C29C69B60C9' WITH GRANT OPTION |

  | GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, CREATE TEMPORARY TABLES, EXECUTE ON `configdb`.* TO 'user_admin'@'%' |

  | GRANT SELECT, INSERT, UPDATE, DELETE ON `mysql`.* TO 'user_admin'@'%' |

  +-----------------------------------------------------------------------------------------------------------------------------------+

  重新使用'user_test1'@'%'用户登录MySQL执行刚才定义的存储过程

  mysql>use configdb;

  mysql> call sp_dev_test_user_add('uapp_yzz','172.16.%','yzz','yzz@email','MySQL DBA');

  Query OK, 0 rows affected (0.05 sec)

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Roblox: Bubble Gum Simulator Infinity - How To Get And Use Royal Keys
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusion System, Explained
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers Of The Witch Tree - How To Unlock The Grappling Hook
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

Java Tutorial
1667
14
PHP Tutorial
1273
29
C# Tutorial
1255
24
Laravel Introduction Example Laravel Introduction Example Apr 18, 2025 pm 12:45 PM

Laravel is a PHP framework for easy building of web applications. It provides a range of powerful features including: Installation: Install the Laravel CLI globally with Composer and create applications in the project directory. Routing: Define the relationship between the URL and the handler in routes/web.php. View: Create a view in resources/views to render the application's interface. Database Integration: Provides out-of-the-box integration with databases such as MySQL and uses migration to create and modify tables. Model and Controller: The model represents the database entity and the controller processes HTTP requests.

MySQL and phpMyAdmin: Core Features and Functions MySQL and phpMyAdmin: Core Features and Functions Apr 22, 2025 am 12:12 AM

MySQL and phpMyAdmin are powerful database management tools. 1) MySQL is used to create databases and tables, and to execute DML and SQL queries. 2) phpMyAdmin provides an intuitive interface for database management, table structure management, data operations and user permission management.

MySQL vs. Other Programming Languages: A Comparison MySQL vs. Other Programming Languages: A Comparison Apr 19, 2025 am 12:22 AM

Compared with other programming languages, MySQL is mainly used to store and manage data, while other languages ​​such as Python, Java, and C are used for logical processing and application development. MySQL is known for its high performance, scalability and cross-platform support, suitable for data management needs, while other languages ​​have advantages in their respective fields such as data analytics, enterprise applications, and system programming.

Laravel framework installation method Laravel framework installation method Apr 18, 2025 pm 12:54 PM

Article summary: This article provides detailed step-by-step instructions to guide readers on how to easily install the Laravel framework. Laravel is a powerful PHP framework that speeds up the development process of web applications. This tutorial covers the installation process from system requirements to configuring databases and setting up routing. By following these steps, readers can quickly and efficiently lay a solid foundation for their Laravel project.

Solve MySQL mode problem: The experience of using the TheliaMySQLModesChecker module Solve MySQL mode problem: The experience of using the TheliaMySQLModesChecker module Apr 18, 2025 am 08:42 AM

When developing an e-commerce website using Thelia, I encountered a tricky problem: MySQL mode is not set properly, causing some features to not function properly. After some exploration, I found a module called TheliaMySQLModesChecker, which is able to automatically fix the MySQL pattern required by Thelia, completely solving my troubles.

Explain the purpose of foreign keys in MySQL. Explain the purpose of foreign keys in MySQL. Apr 25, 2025 am 12:17 AM

In MySQL, the function of foreign keys is to establish the relationship between tables and ensure the consistency and integrity of the data. Foreign keys maintain the effectiveness of data through reference integrity checks and cascading operations. Pay attention to performance optimization and avoid common errors when using them.

Compare and contrast MySQL and MariaDB. Compare and contrast MySQL and MariaDB. Apr 26, 2025 am 12:08 AM

The main difference between MySQL and MariaDB is performance, functionality and license: 1. MySQL is developed by Oracle, and MariaDB is its fork. 2. MariaDB may perform better in high load environments. 3.MariaDB provides more storage engines and functions. 4.MySQL adopts a dual license, and MariaDB is completely open source. The existing infrastructure, performance requirements, functional requirements and license costs should be taken into account when choosing.

SQL vs. MySQL: Clarifying the Relationship Between the Two SQL vs. MySQL: Clarifying the Relationship Between the Two Apr 24, 2025 am 12:02 AM

SQL is a standard language for managing relational databases, while MySQL is a database management system that uses SQL. SQL defines ways to interact with a database, including CRUD operations, while MySQL implements the SQL standard and provides additional features such as stored procedures and triggers.

See all articles