SQL查询限制仅适用于一个字段

时间:2016-11-09 08:04:32

标签: mysql sql oracle oracle11g

我有一个名为Table 01的SQL表,它有3列XYZ

我需要限制SELECT SQL查询仅在Z

请求时返回X & Y列数据

是否有限制SQL SELECT query ??

的方法

3 个答案:

答案 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的

您需要构建一个存储过程,其中xy作为参数返回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