2012-07-18 23 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,但这可能是矫枉过正。 (也可能是一个额外的费用选项,我不确定。)