在 MySQL 连接中传递自定义变量

Pass custom variables in MySQL connection

我正在 REST API 中设置一个 MySQL 连接(在我的例子中是 PDO,但这应该无关紧要)。

REST API 使用内部身份验证(用户名/密码)。有多个用户组访问 REST API,例如客户、IT、后端、客户服务。他们最终都使用相同的 MySQL 连接,因为他们大部分时间也使用相同的端点。

在MySQL 数据库中,我想保存负责数据集更改的用户。

我想通过触发器在 MySQL 层上实现它。因此,我必须以某种方式将用户信息从 REST API 传递到此触发器。有一些 MySQL 调用,如 CURRENT_USER()status 允许查询元信息。我的想法是以某种方式将连接字符串中的附加信息传递给 MySQL,这样我就不必使用不同的数据库用户,但我仍然能够从触发器中检索此信息。

我已经做了一些研究,但认为这是不可能的,但由于它会极大地促进我的任务,我仍然想在 SO 上询问是否有人知道我的问题的解决方案。

我会在连接时设置一个会话变量。

感谢@Álvaro González 的评论提醒我 运行 PDO init 上的命令。

向临时文件添加数据的建议 table 没有必要。假设您只需要几个标量,那么设置一个或多个会话变量同样好。

$pdo = new PDO($dsn, $user, $password, [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET @myvar = 'myvalue', @myothervar = 'othervalue'"
]);

也可以在连接后随时设置会话变量,调用 $pdo->exec()

$pdo->exec("SET @thirdvar = 1234");

您可以在 SQL 查询中读取会话变量:

$stmt = $pdo->query("SELECT @myvar, @myothervar");
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
    print_r($row);
}

您还可以在触发器中读取会话变量:

CREATE TRIGGER mytrig BEFORE INSERT ON mytable
FOR EACH ROW
    SET NEW.somecolumn = @myvar;