2016-11-09 45 views
-1

我有SQL表稱爲Table 01,它有3列作爲XYZSQL查詢的限制只針對一個領域

我需要的SELECT SQL查詢限制到什麼只返回時請求Z列數據for X & Y

是否有限制SQL的方法SELECT query

+0

我可以同時擁有MySQL或Oracle –

+2

添加示例表數據和預期的結果 - 以及格式化文本。同時向我們展示您當前的查詢嘗試。 – jarlh

+0

請編輯您的問題,添加一些樣本數據和所需的結果。另外,發佈你迄今爲止的嘗試以及你的代碼問題 – Aleksej

回答

0

如果限制對於z

SELECT X, Y 
FROM 
    Table01 

如果限制x的SELECT查詢SELECT查詢,Y

SELECT Z 
FROM 
    Table01 
+0

不,我需要設置限制才能選擇Z,請求者不應該能夠得到SELECT *查詢結果 –

+0

我已更新我的答案。它限制選擇Z和請求者無法看到這個列 –

+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 
+0

但我需要從X和Y的where子句得到結果(Z),我該怎麼做, 例如 從

選擇Z,其中X ='1'AND Y ='2' –

+0

你說你想要「看到」一列來應用過濾器,但是您不想「看見」它來獲取值?我相信你不能 – Aleksej

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); 
登錄後

這應該是關鍵