Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在\u集中查找\u并在\u集中查找\u意外结果_Mysql_Stored Procedures - Fatal编程技术网

Mysql 在\u集中查找\u并在\u集中查找\u意外结果

Mysql 在\u集中查找\u并在\u集中查找\u意外结果,mysql,stored-procedures,Mysql,Stored Procedures,要使用的完整数据示例: USE mysql; DROP PROCEDURE IF EXISTS ShowUsers; DELIMITER $ CREATE PROCEDURE `ShowUsers`(IN KnownUsers varchar(500), IN KnownHosts varchar(500)) BEGIN SELECT user,host FROM user WHERE NOT FIND_IN_SET(host, KnownHosts)

要使用的完整数据示例:

USE mysql;
DROP PROCEDURE IF EXISTS ShowUsers;
DELIMITER $

CREATE PROCEDURE `ShowUsers`(IN KnownUsers varchar(500), IN KnownHosts varchar(500))
BEGIN
  SELECT
    user,host
  FROM
    user
  WHERE 
    NOT FIND_IN_SET(host, KnownHosts)
  AND
    NOT FIND_IN_SET(user, KnownUsers)
  ORDER BY user, host ASC;
END $
DELIMITER ;
我已经标记了我希望从运行过程中显示的结果,基本上这两个IN参数是已知用户,而已知主机应该在这个数据库中有一个用户记录

像这样调用函数

+-------------+-------------+
| user        | host        |
+-------------+-------------+
| knownuser1  | 192.168.1.5 |
| knownuser2  | 192.168.1.5 |
| unknownuser | 192.168.1.5 | # I want this result to show
| someuser1   | 192.168.1.6 |
| someuser2   | 192.168.1.6 |
| someuser3   | 192.168.1.6 |
| root        | localhost   |
+-------------+-------------+
预期结果:

# users and hostnames(ips) to match for exclusion from results.
SET @Usernames = 'knownuser1,knownuser2';
SET @Hostnames = '192.168.1.5';

CALL ShowUsers(@Usernames, @Hostnames);
实际结果:

+-------------+-------------+
| user        | host        |
+-------------+-------------+
| unknownuser | 192.168.1.5 | # I want this result to show
| someuser1   | 192.168.1.6 |
| someuser2   | 192.168.1.6 |
| someuser3   | 192.168.1.6 |
| root        | localhost   |
+-------------+-------------+
解释(与本主题无关,但我认为我应该澄清)我希望此过程正常运行的原因,我有一个主服务器,其中包含多个远程从属服务器,从属服务器需要访问主数据库,这意味着它们还必须具有“根”访问权限,它们可以创建/重新配置自己的访问凭据。这样做的问题是,如果其中一台服务器遭到破坏,它将为新用户添加基本上所有数据库的凭据留下机会。完全开放,可以自由使用

我可以在初始配置后锁定从机,手动打开门,运行更新,然后再次锁定它,这对应用程序来说是相当困难的,并且使应用程序实际上毫无用处


我现在的想法是通过cron运行脚本运行此过程,检查未知用户/主机,并将从属服务器锁定在数据库之外,直到我从主应用程序接受或拒绝用户。

WHERE子句中的条件是:

+-------------+-------------+
| user        | host        |
+-------------+-------------+
| someuser1   | 192.168.1.6 |
| someuser2   | 192.168.1.6 |
| someuser3   | 192.168.1.6 |
| root        | localhost   |
+-------------+-------------+
这相当于:

NOT FIND_IN_SET(host, KnownHosts) AND NOT FIND_IN_SET(user, KnownUsers)
这意味着您希望排除以下行:
host
包含在
KnownHosts
中,或者
user
包含在
KnownHosts

因此,对于示例数据,行:

NOT (FIND_IN_SET(host, KnownHosts) OR FIND_IN_SET(user, KnownUsers))
不会返回,因为
host='192.168.1.5'
并且它包含在
KnownHosts
中(=
'192.168.1.5'
)。

如果这是要应用的逻辑,可以将逻辑运算符更改为

unknownuser | 192.168.1.5

在调用存储过程时,您混淆了变量的顺序。感谢您指出,我已经修复了这一问题,直到无法按我所希望的方式工作为止,我有多个用户使用一个IP地址,当我将IP地址添加到编辑后的主机名字符串中时,该IP的所有行都将从结果中删除,如果我的想法是正确的,所有这些都应该显示为没有匹配的用户。更新了问题,希望这能更好地澄清我的意图…包含ip地址的行。。。一行怎么能包含ip地址?对不起,我不明白这个问题。请提供样本数据、样本参数、实际结果和预期结果。好的,这澄清了为什么它不起作用,你对我如何使它起作用有什么建议吗,我假设它与WHERE user的作用相同!=东西和主人!=另一件事。但情况显然并非如此。如果可能的话,我希望不必在脚本中循环数组多次运行查询。它会按照要求执行,从结果中删除匹配项,但如果host1中的user1也添加到host2,它也会匹配。那不是我的本意。我需要找到一种方法,将我提供的用户-主机对从结果中排除,因此如果host1中的用户是在host2上创建的,而我没有传入已知的用户-主机对,那么它们将显示在结果中。这有意义吗?不,这不清楚。我的答案中的代码是基于需求、样本数据和您问题中的预期结果。如果需要满足其他情况和条件,则这是一个完全不同的要求。是的,似乎是这样。我将不得不修改我的问题。当你在问题中引入新的要求时,你就否定了你已经得到的答案。这不是它的工作原理。新要求就是新问题。
NOT FIND_IN_SET(host, KnownHosts) OR NOT FIND_IN_SET(user, KnownUsers)