将信息从视图传递到Oracle中的基表(SQL)

时间:2012-01-28 11:58:26

标签: sql oracle view

我有一点问题!

我有一个原始基表“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;

一切正常 - 插入新行(登录教师帐户时)的问题应该是教师获取新地址并希望将其添加到学校系统。

教师的帐户查询时会显示插入的行,但不会传递给原始基表,这意味着除了教师之外没有其他人可以看到它,甚至不是管理员。

有快速解决方法吗?

非常感谢, 祖鲁

2 个答案:

答案 0 :(得分:1)

您应该在创建视图时使用WITH CHECK OPTION,这样教师角色成员就不能insertupdate数据的StaffID不同于他们自己的数据,即

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

此外,同意@danihp,只是因为我看到为什么数据似乎没有被传递到表以供管理员查看,是因为插入事务没有被提交。

答案 1 :(得分:0)

根据我的“Pro Oracle Database 11g管理”一书:

  

如果您不希望用户能够执行INSERT,UPDATE或   对视图执行DELETE操作,然后不授予这些对象权限   在该用户的基础表上。

当然,您希望允许 DML操作到基础表。对我来说,这也说明你还需要确保“Teacher”对StaffAddressDetails表具有适当的权限。

GRANT SELECT, INSERT, UPDATE ON StaffAddressDetails TO Teacher;

为了回应Carl的回答,使用WITH CHECK OPTION创建这种类型的视图是一个好主意。