需求 1)需要使用A用户建立B用户的表,但我们又不能授予A create any table的权限(因为这样A用户就可以在所有用户下建立表),但目前也没有更细颗粒度的权限可以授予用户;
2)当已经授予用户A用户B下的表查询权限,当用户B下新增表,又需要再次授予B用户新增表的权限,运维使用起来比较繁琐;
以上情况就可以通过代理用户解决。
环境 DM8 windows版本
代理用户使用方式 1、创建测试用户
1 2 3 4 CREATE USER A IDENTIFIED BY A123456789 ;CREATE USER B IDENTIFIED BY B123456789 ;ALTER USER A GRANT CONNECT THROUGH B ; GRANT PUBLIC, RESOURCE ,SOI ,SVI ,VTI TO A ;
2、创建测试表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 SQL > conn A/ A123456789服务器[LOCALHOST:5236 ]:处于普通打开状态 登录使用时间 : 21.292 (ms) SQL > select user ;行号 USER () 1 A已用时间: 16.286 (毫秒). 执行号:19600. SQL > create table test(id int ,name varchar (10 ));操作已执行 已用时间: 20.098 (毫秒). 执行号:19601. SQL > insert into test values (1 ,'a' );影响行数 1 已用时间: 1.097 (毫秒). 执行号:19602. SQL > commit ;操作已执行 已用时间: 0.996 (毫秒). 执行号:19603. SQL > select * from test;行号 ID NAME 1 1 a已用时间: 0.680 (毫秒). 执行号:19604. SQL >
3、代理用户登录查询并创建用户
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 SQL > conn B/ B123456789@localhost #{proxy_client= A}服务器[localhost:5236 ]:处于普通打开状态 登录使用时间 : 18.721 (ms) SQL > SELECT USER ;行号 USER () 1 A已用时间: 1.790 (毫秒). 执行号:19900. SQL > SELECT * FROM TEST;行号 ID NAME 1 1 a已用时间: 1.170 (毫秒). 执行号:19901. SQL > CREATE TABLE TT(ID INT );操作已执行 已用时间: 18.773 (毫秒). 执行号:19902. SQL > INSERT INTO TT VALUES (1 );影响行数 1 已用时间: 1.107 (毫秒). 执行号:19903. SQL > COMMIT ;操作已执行 已用时间: 15.097 (毫秒). 执行号:19904. SQL > SELECT * FROM TT;行号 ID 1 1 已用时间: 0.809 (毫秒). 执行号:19905. SQL > CONN A/ A123456789服务器[LOCALHOST:5236 ]:处于普通打开状态 登录使用时间 : 19.313 (ms) SQL > SELECT * FROM TT;行号 ID 1 1 已用时间: 1.047 (毫秒). 执行号:20100. SQL > conn B/ B123456789服务器[LOCALHOST:5236 ]:处于普通打开状态 登录使用时间 : 23.851 (ms) SQL > select * from test;select * from test;第1 行附近出现错误[-2106 ]:无效的表或视图名[TEST]. 已用时间: 15.214 (毫秒). 执行号:0. SQL >
总结 通过代理方式登录用户B,此时的权限与被代理用户A的权限保持一致,且登录用户的密码为用户B。