2012-01-28 20 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

+1

注釈: 'staffID = user'と書いても十分です。' select user from dual'の必要はありません –

答えて

1

WITH CHECK OPTION、あなたのビューを作成するので、教師の役割のメンバーではない、すなわち自分自身とは異なるStaffIDinsertまたはupdateデータ、

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

することができますさらに@danihpに同意すると、なぜデータが管理者が見るためにテーブルに渡されていないように見えるのかという理由だけが、トランザクションの挿入はコミットされていないことになります。私の「プロのOracle Database 11gの管理」の本によると

+0

下にあるテーブルへのopsの付与に関する下記のコメント。つまり、ブックからの一方向のステートメントは、ユーザーがビューを更新するのを止めるときに適用されますが、別の方法では適用されません。この場合、基になるテーブルにはビューにのみ権限を与える必要はありません。 –

0

ユーザーが「ドン、その後、ビューにINSERT、UPDATE、または DELETE操作を実行できるようにしたくない場合そのオブジェクトの基礎となる表のオブジェクト権限 をそのユーザーに付与しないでください。

もちろん、に、の基になるテーブルへのDML操作を許可します。私には、「教師」にもStaffAddressDetailsテーブルに対する適切な権限があることを確認する必要があると言われています。

GRANT SELECT, INSERT, UPDATE ON StaffAddressDetails TO Teacher; 

Carlの答えをエコーするには、WITH CHECK OPTIONを使用してこのタイプのビューを作成することをお勧めします。