sql - 启动 MySQL 例程和脚本

标签 sql mysql stored-procedures

我使用 MySQL 一段时间了,但只使用基本查询和一些连接。我想开始使用存储过程,但我很难找到好的资源来帮助我了解我想知道的事情。

我想知道的主要事情是如何在返回任何内容之前检查整个数据库中任何字段的值。例如:定义用户的表,定义用户拥有哪些权限的表。我想在做任何事情之前检查是否存在一定的权限->用户关系。

这是一个简化的表格:

Users:
ID     |   Username
1      |   User1
2      |   User2
3      |   User3
N      |   UserN

Permissions:
User ID      |     Permission ID
1            |     1
2            |     1
1            |     2
etc etc

所以基本上,我想将以下伪代码转换为 MySQL 例程:

if (SELECT * FROM Permissions WHERE 'User ID' = ? and 'Permission ID' = ? returns at least one row) {
      execute privileged sql
      return true
 }
 return false

我知道我可能会在这里问很多问题,但是任何帮助将不胜感激!

最佳答案

这是一个例子:

drop table if exists Permissions;

create table  Permissions (
    id int,
    username varchar(50)
);
insert into Permissions (id, username) 
select 1, 'Gump'
union select 2, 'Forrest';

drop procedure if exists CheckPermissions;

DELIMITER //
 CREATE PROCEDURE CheckPermissions(
    IN checkPermission int,
    IN checkUser varchar(50),
    IN execSql varchar(512))
   BEGIN
   DECLARE declSql varchar(512);
   IF EXISTS (SELECT *  FROM Permissions p 
              WHERE p.id = checkPermission AND p.username = checkUser) 
   THEN
     SET @declSql = execSql;
     PREPARE stmt FROM @declSql;
     EXECUTE stmt;
     DEALLOCATE PREPARE stmt;
   END IF;
   END //
 DELIMITER ;

call CheckPermissions(1, 'Gump', 'select 1 as PermissionOk');
call CheckPermissions(2, 'Gump', 'select 2 as NotExecuted');

打印:

PermissionOK
1

MySQL 中的过程使用和开发起来很痛苦。例如,我必须将参数 SQL 复制到声明的变量,因为否则它不起作用;该文档没有提供任何线索。

如果可能的话,我会在客户端实现此逻辑。

关于sql - 启动 MySQL 例程和脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3129816/

相关文章:

mysql - 从消息表中查询对话

php - 选择帖子、最后 3 条评论以及所有评论的计数

python - 将字符串的十六进制字符转换为python中的普通字符

sql - 存储过程创建后如何执行?

java - JPA EclipseLink 自定义实体/对象作为 IN 参数

mysql - 你能在 MySQL 上练习 MSSQL 查询吗?

SQL Server 查询返回同一行两次

mysql - 如何优化查找不存在条件联接行的行的查询?

mysql - MySql Inner Join 的问题 > 未包含在聚合函数或 GROUP BY 子句中

SQL sp_send_dbmail 发送带有附件的电子邮件,pdf 文件已损坏