2017-07-25 14 views
1

我已經在Oracle 12c中創建了一些約束的視圖。但是,當我插入違反約束的值也能夠從視圖中插入。這似乎是一個漏洞。創建視圖有一些限制,但它插入時不出現

- 創建視圖Emp_1

CREATE VIEW Emp_1 
AS 
SELECT Empid, Ename, Salary 
FROM employees 
WHERE salary < 25000 

這種觀點是要表明誰是有小於25000的工資只有員工。

但是,當我插入超過25000作爲工資的員工,查看允許我插入(這是不正確的)。但它不會出現在我查詢視圖(這是正確的)

這是作爲設計還是我能做些什麼來克服這一點?

從技術上講,這是一個可插入的視圖。所以它允許插入。但從概念上講,用戶只能看到工資低於25000的員工。因此,不允許插入超過條件的員工。

請糾正我,如果我錯了,請幫助。

+0

視圖顯示數據:所以WHERE子句從基礎表過濾行。 – APC

回答

-1

您將不得不在employees表上添加約束條件。視圖只是查詢的表示。它沒有分配的存儲,並且由於基礎表沒有任何這樣的約束,所以您可以插入該數據。所以設計和輸出是應該的。

3

朋友感謝您的幫助。我現在找到了。

您可以使用WITH CHECK OPTION CONSTRAINT來完成此操作。

CREATE VIEW Emp_2 
AS 
SELECT Empid, Date_Joined, Salary 
FROM employees 
WHERE salary < 25000 
WITH CHECK OPTION CONSTRAINT Emp_2_Salary_Constraint; 

然後當你違反它時顯示這個錯誤。

SQL Error: ORA-01402: view WITH CHECK OPTION where-clause violation

相關問題