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)