1

我有一张桌子,里面有属于不同客户的不同人:

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 Corp”所有行的名字的权限。到人 A 和“B Corp.”的行 给 B 人。我认为可以通过为每个人创建一个视图来实现。但是,是否也可以不为每个人创建专门的授权视图?

4

1 回答 1

4

如果您可以使用 Oracle 用户名或应用程序中的某些数据来识别用户,那么我认为您可以使用单个可更新视图,例如:

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

(其中“USER”是一个返回登录用户名的 Oracle SQL 函数。如果最终用户通过某个中间层共享数据库帐户,这将不起作用,但您可能可以从中间层并使用它。)

为了避免硬编码用户名和客户端名称之间的关系,我建议添加另一个表来标识哪些用户可以管理哪些客户端。那么视图将是这样的:

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 的虚拟专用数据库功能,但这可能是矫枉过正。(这也可能是一个额外费用的选择,我不确定。)

于 2012-07-18T11:55:17.723 回答