需求
有个这样一个需求,A库和B库是逻辑库,在同一个数据库实例下面,A库有个表1,B库有个表2,
另外A库和B库使用的是不同的用户名授权连接的
现在想通过A库表1和B库表2通过某一列的字段值关联查询,做个报表查询
当然如果很方便的方式,直接select查询的时候使用逻辑库.表名的方式。我这里采用了另外一种方式来做那就是视图(因为B库的某些表,某些列的数据不想返回)
实践
准备环境数据
首先这里说明下,下面执行语句都是基于5.7.35的mysql版本
为了实现这种需求,我这里本地做个测试,首先准备两个测试库,两个用户账号
--test数据库
create user 'test'@'%' identified by 'Aa@12345678';
--test1数据库
create user 'test1'@'%' identified by 'Aa@12345678';
创建数据库就很简单了,用自己客户端工具创建,这里不在演示,
用root用户连接针对对应的用户访问对应的数据库
GRANT ALL PRIVILEGES ON test1.* TO 'test1'@'%' IDENTIFIED BY 'Aa@12345678' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON test.* TO 'test'@'%' IDENTIFIED BY 'Aa@12345678' WITH GRANT OPTION;
flush privileges;
授权错了,怎么办?
如果授权错误了,也可以设置回收命令执行这个
revoke all privileges on test1.es_user from 'test'@'%' ;
flush privileges;
如果结果执行报了这个错误,怎么处理?
分析看起来好像是密码策略的问题,这个错误提示是因为MySQL 5.7默认启用了密码策略插件,密码必须符合一定的复杂度要求才能被使用。
我们使用下面命令查看下
show variables like '%validate_password%'
解决办法
设置密码策略低点或者修改密码
set global validate_password_policy=LOW;
再次执行
revoke all privileges on test1.es_user from 'test'@'%' ;
flush privileges;
现在我们使用root用户执行下面的语句给test账号赋予授权test1库的es_user表的操作
GRANT ALL PRIVILEGES ON test1.es_user TO 'test'@'%' IDENTIFIED BY 'Aa@12345678' WITH GRANT OPTION;
flush privileges;
很不行,没有执行成功,看错误是拒绝授权,我们看下root用户权限
use mysql;
select * from user where user='root';
我们修改下这个字段值为Y
update user set Grant_priv='Y' where user='root'
flush privileges;
关闭会话窗口,重新打开,在执行这个命令,看到已经执行成功了
GRANT ALL PRIVILEGES ON test1.es_user TO 'test'@'%' IDENTIFIED BY 'Aa@12345678' WITH GRANT OPTION;
flush privileges;
创建视图语句
讲清楚点,我们这里是使用test用户在它的数据库来创建视图哦,因为它现在已经有test1库es_user的表权限了,要不然我们上面在干嘛
创建视图
CREATE VIEW vm_user AS ( SELECT * FROM test1.es_user );
使用视图来验证查询
SELECT
eu.*
FROM
es_user eu
LEFT JOIN vm_user vu
ON eu.ESUS_ID = vu.ESUS_ID
看到已经查询出来对应的结果了