2012-01-28 72 views
2

我有一個小問題!將視圖中的信息傳遞給Oracle中的基表(SQL)

我有一個原始的基表「StaffAddressDetails」

CREATE TABLE StaffAddressDetails 
(ContactID INTEGER NOT NULL, 
Postcode VARCHAR (10) NOT NULL, 
HouseNameOrNumber VARCHAR (50) NOT NULL, 
Street VARCHAR (50) NOT NULL, 
Street2 VARCHAR (50) DEFAULT '...', 
Town VARCHAR (50) NOT NULL, 
County VARCHAR (50) NOT NULL, 
Country VARCHAR (50) NOT NULL, 
StaffID INTEGER NOT NULL, 
CONSTRAINT StaffAddressDetails_PK PRIMARY KEY (ContactID, Postcode), 
CONSTRAINT StaADContactIDSCD FOREIGN KEY (ContactID) 
REFERENCES StaffContactDetails (ContactID)); 

我希望員工的成員能夠只看到自己的細節,所以我有一個創建一個視圖「HDPBHTTSKStaffAddDetsForSelf」並授予該視圖的角色「老師」

CREATE VIEW HDPBHTTSKStaffAddDetsForSelf AS 
SELECT * FROM StaffAddressDetails 
WHERE StaffID IN 
(SELECT USER 
FROM DUAL); 

......還有......

GRANT SELECT, INSERT, UPDATE ON HDPBHTTSKStaffAddDetsForSelf TO Teacher; 

這一切工作正常 - 插入新行(當老師的帳戶登錄)時應該說,老師獲得一個新的地址,並希望將其添加到學校系統的問題就來了。

,插入的行從老師的賬戶查詢時出現,但不會傳承給原來的基表,這意味着沒有人,除了老師可以看到它,甚至沒有管理。

是否有快速修復?

提前許多感謝, 祖魯

+4

你提交了插入的行嗎? – danihp 2012-01-28 13:41:26

+1

作爲一個側面說明:只需寫'where staffID = user'就不需要'雙用戶選擇用戶' – 2012-01-28 23:27:01

回答

1

您應該使用WITH CHECK OPTION創建視圖時,讓教師角色成員不能insertupdate數據不同StaffID不是自己的,即

create view ... as select ... from ... where ... WITH CHECK OPTION; 

此外,同意@danihp,我明白爲什麼數據似乎沒有傳遞給管理員看到的表的原因是插入事務沒有被提交。

+0

在授予操作基礎表的操作時註釋如下;這是本書的單向聲明,適用於阻止用戶更新視圖但不適用於其他方式的情況。在這種情況下,不應在基礎表上授予特權,只能在視圖上授予特權。 – 2012-01-30 22:13:14

0

根據我的「臨Oracle數據庫11g管理」的書:

如果你不希望用戶能夠在一個視圖中執行INSERT,UPDATE或DELETE 操作,然後穿上」 t將基礎表上的對象特權 授予該用戶。

當然,你想允許 DML操作到底層表。對我來說,這也表示你還需要確保「Teacher」在StaffAddressDetails表上也有適當的權限。

GRANT SELECT, INSERT, UPDATE ON StaffAddressDetails TO Teacher; 

爲了迴應Carl的回答,使用WITH CHECK OPTION創建這種類型的視圖是個不錯的主意。