- 締切済み
インラインビューの更新権限について
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'; のような確認しかできないのでしょうか? よろしくお願いいたします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- yamada_g
- ベストアンサー率68% (258/374)
>ビューを作ったとき、UPDATEやINSERT文が有効・無効になる違いは何でしょうか? おおざっぱにいうとVIEWがテーブルの主キーを保持しているか、ということではないですかね。 このあたりを読んでみてください。 http://download.oracle.com/docs/cd/E16338_01/server.112/b56299/statements_8004.htm#sthref5559 http://download.oracle.com/docs/cd/E16338_01/server.112/b56301/views001.htm#i1006318
お礼
ありがとうございます。 テーブルの主キーを保持しているかというのは、VIEWの中に主キー一部を含んでいるという事か、すべて含んでいるかというのがよく分かりません。
補足
ありがとうございます。 テーブルの主キーを保持しているかというのは、VIEWの中に主キー一部を含んでいるという事か、すべて含んでいるかというのがよく分かりません。