使用视图时的特权

当您尝试使用视图时,数据库服务器只测试已授予您的对该视图的特权。它不测试您是否具有访问基础表的权限。

如果视图由您创建,那么您具有前一节记载的特权。如果您不是创建者,那么您具有创建者(或某个具有 WITH GRANT OPTION 特权的人)授予您的特权。

因此,您可以创建一个表并撤销 PUBLIC 对它的访问权;然后,可通过视图对该表授予有限的访问特权。假定要授予对下面这个表的访问特权:
CREATE TABLE hr_data 
   (
      emp_key INTEGER,
      emp_name CHAR(40),
      hire_date DATE,
      dept_num SMALLINT,
      user-id CHAR(18),
      salary DECIMAL(8,2), 
      performance_level CHAR(1), 
      performance_notes TEXT
   )
列级别特权一节显示了如何直接授予对 hr_data 表的访问特权。下列示例采用另一种方法。 假定创建该表时执行了以下语句:
REVOKE ALL ON hr_data FROM PUBLIC
(在符合 ANSI 标准的数据库中,这样的语句不是必需的。)现在,为不同的用户类创建一系列视图。对于应该对非敏感列具有只读访问权的用户,创建以下视图:
CREATE VIEW hr_public AS
      SELECT emp_key, emp_name, hire_date, dept_num, user_id
            FROM hr_data
对此视图拥有 Select 特权的用户可以查看不敏感的数据,但不能进行更新。对于必须输入新行的“人力资源”人员,创建另一个视图,如以下示例所示:
CREATE VIEW hr_enter AS
      SELECT emp_key, emp_name, hire_date, dept_num
            FROM hr_data

将对此视图的 Select 和 Insert 特权授予这些用户。由于您(您同时是表和视图的创建者)对表和视图具有 Insert 特权,所以您可以将对该视图的 Insert 特权授予其他对该表不具有特权的人。

对于 MIS 部门中输入或更新新用户标识的人员,还要创建另一个视图,如以下示例所示:
CREATE VIEW hr_MIS AS
      SELECT emp_key, emp_name, user_id
            FROM hr_data

此视图与前一视图的不同点在于,它不显示部门号和聘用日期。

最后,经理需要访问所有列,并且他们需要能够只更新他们自己的员工的业绩考核数据。可通过创建 hr_data 表来满足这些需求,该表包含每个雇员的部门号和计算机用户标识。让经理作为他们所管理的部门的成员作为一条规则。于是,以下视图将限制经理只能访问只反映他们的雇员的行:
CREATE VIEW hr_mgr_data AS
      SELECT * FROM hr_data
            WHERE dept_num = 
                  (SELECT dept_num FROM hr_data
                        WHERE user_id = USER)
            AND NOT user_id = USER
最后一个条件是必需的,这样经理才不具有对表中他们自己的行的更新访问权。因此,可以安全地将此视图的 Update 特权授予经理,但只授予对所选列的 Update 特权,如以下语句所示:
GRANT SELECT, UPDATE (performance_level, performance_notes)
      ON hr_mgr_data TO peter_m