我有一个名为Table 01
的SQL表,它有3列X
,Y
,Z
我需要限制SELECT SQL
查询仅在Z
X & Y
列数据
是否有限制SQL SELECT query
??
答案 0 :(得分:1)
假设您在架构USER1
中有一个表,并且您希望允许其他用户(例如USER2
)仅查询列z
;你可以在你的桌子上建立一个视图,只在视图上给予授权,而不在桌子上给予任何授权;以这种方式USER2
只能看到视图中包含的列,而不是整个表。
例如
<强> USER1 强>:
create table completeTable(x number, y number, z number);
create view restrictedTable as select z from completeTable;
insert into completeTable values (1, 2, 3);
grant select on restrictedTable to USER2;
create public synonym restrictedTable for restrictedTable;
<强> USER2 强>:
SQL> select x, y, z from completeTable;
select x, y, z from completeTable
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> select x, y, z from restrictedTable;
select x, y, z from restrictedTable
*
ERROR at line 1:
ORA-00904: "Y": invalid identifier
SQL> select z from restrictedTable;
Z
----------
3
答案 1 :(得分:1)
这是针对MySQL的
您需要构建一个存储过程,其中x
和y
作为参数返回select z from t0
,然后使用用户权限拒绝访问从t0选择x,y授予执行程序:
CREATE USER 'ReadOnlyUseruser'@'localhost' IDENTIFIED BY '' ;
GRANT SELECT (z) ON MySchema.t0 TO 'ReadOnlyUseruser'@'localhost' ;
GRANT EXECUTE ON MySchema.* TO 'ReadOnlyUseruser'@'localhost';
select x,y from t0
Error Code: 1143. SELECT command denied to user 'ReadOnlyUseruser'@'localhost' for column 'x' in table 't0'
但select z from t0
将起作用
现在,对于过滤器部分:
DELIMITER $$
drop procedure `sp_t0`;
CREATE DEFINER=`root`@'localhost' PROCEDURE `sp_t0`(
in px int,
in py int
)
BEGIN
SELECT z FROM t0
where x=px and y=py;
END
最后,使用ReadOnlyUser
登录后SET @x = 23;
SET @y = 35;
call sp_t0(@x,@y);
这应该可以解决问题
答案 2 :(得分:0)
如果限制Z
的SELECT查询SELECT X, Y
FROM
Table01
如果限制SELECT查询x,y
SELECT Z
FROM
Table01