在SQL中使用检查选项

时间:2018-06-22 08:37:03

标签: sql oracle

我已经创建了一个带有检查选项的视图,该视图将薪资限制如下:

CREATE OR REPLACE VIEW EMPVIEWSAL
AS (
  SELECT EMPLOYEE_ID, LASTNAME, SALARY FROM EMPLOYEES
  WHERE SALARY >= 5000
)
WITH CHECK OPTION CONSTRAINT EMPVIEWSAL_CK;

然后,我添加一个新列,并对其他列进行如下修改:

CREATE OR REPLACE VIEW EMPVIEWSAL (EMPLOYEE_ID, "COMPLETE NAME", JOB_ID, BONUS)
AS (
  SELECT EMPLOYEE_ID, LASTNAME||','||FIRSTNAME, JOB_ID, SALARY + .1*SALARY FROM EMPLOYEES
);

我的问题是,在第二条语句之后,它从未将薪水限制为> = 5000,并且在输出中我的薪水低于该值。为什么我已经添加到视图中的检查选项没有限制我第二条报表的薪水?

感谢您能就此事给我提建议。

1 个答案:

答案 0 :(得分:2)

您不是修改视图,而是在重新定义它。 create or replace view与使用drop view后跟create view的唯一真正区别是保留了在视图上授予的所有特权。 (当然,如果视图已经存在,它将不会失败。)

您必须在查询中使用相同的过滤器以及所需的其他选项重新创建视图:

CREATE OR REPLACE VIEW EMPVIEWSAL (EMPLOYEE_ID, "COMPLETE NAME", JOB_ID, BONUS)
AS (
  SELECT EMPLOYEE_ID, LASTNAME||','||FIRSTNAME, JOB_ID, SALARY + .1*SALARY FROM EMPLOYEES
  WHERE SALARY >= 5000
)
WITH CHECK OPTION CONSTRAINT EMPVIEWSAL_CK;

with check option子句并不将查询结果限制为薪水低于5000的查询结果。 See the documentation for what that does.


顺便说一句,我会避免使用带引号的标识符,因为无论引用到何处,都必须将其引号。最好有:

where

或类似的东西。