プロが教える店舗&オフィスのセキュリティ対策術

UPDATE句をインラインビューを使って実施しようと思い

UPDATE ( SELECT A.FLD1,B.FLD2 FROM TBL1 A,TBL2 B
WHERE A.KEY1=B.KEY1 AND CONCAT(A.KEY2,A.KEY3)=B.KEY2
AND B.KEY2='12345') C
SET C.FLD1=C.FLD2
のようにSQLを書きました。

ORA-01779: キー保存されていない表にマップする列は変更できません
のメッセージが出力されました。

CREATE VIEW TEST AS
SELECT A.FLD1,B.FLD2 FROM TBL1 A,TBL2 B
WHERE A.KEY1=B.KEY1 AND CONCAT(A.KEY2,A.KEY3)=B.KEY2
AND B.KEY2='12345'

でビューを作って確認したら
select * from user_updatable_columns where table_name='TEST';

OWNER TABLE_NAME COLUMN_NAME UPDATA INSERT DELETA
---------- ----------- --------------- ------ ------ ------
TEST TEST FLD1 NO NO NO
TEST TEST FLD2 NO NO NO

確かにUPDATEできないようです。

テーブルはこんな感じです。
TBL1
-------------------------------------------
KEY1 NUMBER 4 PK
KEY2 NUMBER 5 PK
KEY3 NUMBER 1 PK
FLD1 CHAR 6

TBL2
-------------------------------------------
KEY1 NUMBER 4 PK
KEY2 NUMBER 6 PK
FLD2 CHAR 6

同じように

TBL3
-------------------------------------------
KEY1 NUMBER 2 PK
KEY2 NUMBER 4 PK
KEY3 CHAR 6 PK
KEY4 NUMBER 4 PK
FLD3 CHAR 6


TBL4
-------------------------------------------
KEY1 NUMBER 4 PK
KEY2 CHAR 6 PK
FLD4 CHAR 6

でビューを作ったら
CREATE VIEW TEST2 AS
SELECT A.FLD3,B.FLD4 FROM TBL3 A,TBL4 B
WHERE A.KEY2=B.KEY2 AND A.KEY3=B.KEY3
AND A.KEY1='12'
AND A.KEY4='1234'

OWNER TABLE_NAME COLUMN_NAME UPDATA INSERT DELETA
---------- ----------- --------------- ------ ------ ------
TEST TEST2 FLD3 YES YES YES
TEST TEST2 FLD4 NO NO NO

更新可能なようです。

ビューを作ったとき、UPDATEやINSERT文が有効・無効になる違いは何でしょうか?
毎回一旦ビューを作って
select * from user_updatable_columns where table_name='TEST';
のような確認しかできないのでしょうか?

よろしくお願いいたします。

A 回答 (1件)

>ビューを作ったとき、UPDATEやINSERT文が有効・無効になる違いは何でしょうか?


おおざっぱにいうとVIEWがテーブルの主キーを保持しているか、ということではないですかね。
このあたりを読んでみてください。
http://download.oracle.com/docs/cd/E16338_01/ser …
http://download.oracle.com/docs/cd/E16338_01/ser …

この回答への補足

ありがとうございます。
テーブルの主キーを保持しているかというのは、VIEWの中に主キー一部を含んでいるという事か、すべて含んでいるかというのがよく分かりません。

補足日時:2011/09/08 18:04
    • good
    • 0
この回答へのお礼

ありがとうございます。
テーブルの主キーを保持しているかというのは、VIEWの中に主キー一部を含んでいるという事か、すべて含んでいるかというのがよく分かりません。

お礼日時:2011/09/13 15:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!