2012-07-18 44 views
1

我有不同的人屬於不同的客戶端表:如何將權限授予Oracle中的一行?

CREATE TABLE CLIENTS 
(
    CLIENT VARCHAR2(20), 
    FIRSTNAME VARCHAR2(20) 
) 

示例數據:

INSERT INTO CLIENTS (CLIENT, FIRSTNAME) VALUES ('A Corp.', 'Alice') 
INSERT INTO CLIENTS (CLIENT, FIRSTNAME) VALUES ('B Corp.', 'Bob') 

現在我想授予改變「A的所有行頭名的權限公司」人A和'B公司'的行給B人。我認爲可以通過爲每個人創建一個視圖來實現。但是,是否也可以不爲每個人創建專門的授權視圖?

回答

4

如果你可以使用Oracle的用戶名,或在應用程序中某些數據來識別用戶,那麼我想你可以使用一個更新的視圖,喜歡的東西:

CREATE VIEW filtered_clients AS (
    SELECT * FROM clients WHERE client LIKE USER || ' Corp.' 
) 

(其中「user 「是一個返回登錄用戶名的Oracle SQL函數,如果最終用戶通過某個中間層共享一個數據庫帳戶,這將不起作用,但你可能會從中間層傳遞最終用戶名,使用它)

爲了避免硬編碼用戶名和客戶端名稱之間的關係,我建議添加另一個表ident ifies哪些用戶可以管理哪些客戶端。然後視圖將是這樣的:

CREATE VIEW filtered_clients AS (
    SELECT * FROM clients WHERE client IN (
    SELECT client FROM user_client_access WHERE username = USER 
) 
) 

我相信這仍然是可更新的。您可能想要阻止更新到CLIENT列;您可以通過在視圖上指定WITH CHECK OPTION或在基表上使用觸發器來執行此操作。

如果您希望用戶能夠看到任何行,但只更新其自己的行,那麼視圖方法就不行。相反,您只需在基表上有一個觸發器即可在每次嘗試更新時檢查訪問權限,並在用戶嘗試更新針對不同客戶端的行時引發錯誤。

另一種方法是使用Oracle's Virtual Private Database feature,但這可能是矯枉過正。 (也可能是一個額外的費用選項,我不確定。)