« Oracle de XMLDB #8 - またまた少々脱線 | トップページ | Mac De Oracle : プロフィールの画像再度変更?! »

2007年11月25日 (日) / Author : Hiroshi Sekiguchi.

Oracle de XMLDB #9 - またまた少々脱線の続き

子持ちのDiscusとなって初投稿。なにげに左の画像も変えてみたり。。。 :)

Discusという魚、ディスカスミルクで子供を育てるんですよ!

discusは一夫一婦制で子育ては両親協力して行うんです。
孵化後数日し幼魚が親のまわりを泳ぎ始めると
親discusの体からは栄養のある分泌物が出し始めます。
それがディスカスミルク!

ディスカスミルクを飲むために親の体に群がる子discusたち。ほんとにかわいいです。


前置きはこれくらいにして、本題へ。

前回はHttpUriType型やその型を利用している(と思われる)DBMS_PARSER.PARSE(parser,uri)ファンクションでは参照するXML文書の文字エンコーディングとデータベースキャラクタセットが異なる場合、文字化けの影響でパースエラーが発生するというということだった。(Oracle10g R1/R2それにOracle11g R1でも)

その最後で。「・・・略・・・。上記のコードをそのまま実行しようとするとエラーになる。」と書いていたのだが、覚えているだろうか?

そのエラーは以下のような場合でも発生する。

以下、ウチの奥さんのブログのFEED(ATOM version=0.3)を利用して試してみた。(Oracle11g以降では以下のようにセキュリティが強化されている。)

Last login: Thu Nov 22 21:58:23 on ttyp1
Welcome to Darwin!
G5Server:˜ oracle$
G5Server:˜ oracle$ ssh oracle@corydoras
oracle@corydoras's password:
Last login: Thu Nov 22 22:39:56 2007 from 192.168.1.19
[oracle@corydoras ˜]$
[oracle@corydoras ˜]$
[oracle@corydoras ˜]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.6.0 - Production on 木 11月 22 22:46:51 2007

Copyright (c) 1982, 2007, Oracle. All rights reserved.

SCOTT> l
1 SELECT *
2 FROM
3 XmlTable(
4 'for $i in //*
5 return $i'
6 PASSING HttpUriType('http://atsu-log.way-nifty.com/today_s_menu/atom.xml').getXML()
7* )
SCOTT> /
PASSING HttpUriType('http://atsu-log.way-nifty.com/today_s_menu/atom.xml').getXML()
*
行6でエラーが発生しました。:
ORA-29273: HTTPリクエストに失敗しました ORA-06512:
"SYS.UTL_HTTP", 行1674
ORA-24247: アクセス制御リスト(ACL)によりネットワーク・アクセスが拒否されました ORA-06512: "SYS.HTTPURITYPE",
行34
ORA-06512: "SYS.HTTPURITYPE", 行97



詳しくはマニュアルを読んでもらうとして、HttpUriType型でネットワークアクセスを許可してみる。

マニュアル(英語)
Managing Fine-Grained Access to External Network Services
Using DBMS_NETWORK_ACL_ADMIN

● まず、現状確認

DBA_NETWORK_ACLSビューとDBA_NETWORK_ACL_PRIVILEGESビューという2つのディクショナリビューで確認する。
以下の結果からも分かるように、外部ネットワークへのアクセスを許可するACLなど一切定義されていない。

SYS> select acl,host from dba_network_acls;

レコードが選択されませんでした。

SYS> select principal,acl,privilege,is_grant from dba_network_acl_privileges where principal = 'SCOTT';

レコードが選択されませんでした。

SYS>

● ACLを作成し、参照先ホストや必要な権限を付与する。

Managing Fine-Grained Access Control to External Network Services from the Databaseに書かれているように、ACLを作成後connect及び、resolve権限をSCOTTユーザへ付与し、そのACLに対してアクセス先のホストを割り当てる。

注)コミットをお忘れなく!
SYS> BEGIN
2 DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(
3 acl=> 'feeds.xml',
4 description=>'acl for any feeds',
5 principal=> 'SCOTT',
6 is_grant=> true,
7 privilege=> 'connect'
8 );
9 DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(
10 acl=> 'feeds.xml',
11 principal=>'SCOTT',
12 is_grant=>true,
13 privilege=>'resolve'
14 );
15 DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(
16 acl=>'feeds.xml',
17 host=> 'atsu-log.way-nifty.com'
18 );
19 COMMIT;
20 END;
21 /

PL/SQLプロシージャが正常に完了しました。

SYS> select acl,host from dba_network_acls;

ACL HOST
---------------------------------------- --------------------------------------------------
/sys/acls/feeds.xml atsu-log.way-nifty.com

SYS> select principal,acl,privilege,is_grant from dba_network_acl_privileges
2 where principal='SCOTT';

PRINCIPAL ACL PRIVILE IS_GRANT
---------- ---------------------------------------- ------- --------------------
SCOTT /sys/acls/feeds.xml connect true
SCOTT /sys/acls/feeds.xml resolve true

SYS>


● 再度、試してみる。

お〜〜〜。上手く行きました。
NOTE:
Oracle10g R2でも同じことはできますがACLで保護されていないので前述の手順は無くても行えます。

SCOTT> l
1 SELECT *
2 FROM
3 XmlTable(
4 'for $i in //*
5 return $i'
6 PASSING HttpUriType('http://atsu-log.way-nifty.com/today_s_menu/atom.xml').getXML()
7* )
SCOTT> /

COLUMN_VALUE
--------------------------------------------------------------------------------
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/d
c/elements/1.1/"><title>今日のゴハン</title><link rel="alternate" type="text/htm
l" href="http://atsu-log.way-nifty.com/today_s_menu/"/><id>tag:app.cocolog-nifty
.com,2003:weblog-121882</id><link rel="service.post" type="application/x.atom+xm
l" href="http://app.cocolog-nifty.com/t/atom/weblog/blog_id=121882" title="今日
のゴハン"/><modified>2007-11-24T11:17:10Z&;t/modified><tagline>今日もごちそうさま
。(ぺこり)</tagline><generator url="http://www.typepad.com/" version="1.0">

・・・・・中略・・・・

<br xmlns="http://www.w3.org/1999/xhtml"/>
<p xmlns="http://www.w3.org/1999/xhtml">今日は夕方近くに散歩に出かけたら北風で手
が冷たくなったダーリン。<br/>
この麻婆豆腐のおかげで手も温かくなり、さらに汗だくになるくらいカプサイシン効果を
<br xmlns="http://www.w3.org/1999/xhtml"/>

197行が選択されました。

あ〜〜〜っ。長いのでちゃんと絞り込んでみましょう。

SCOTT> l
1 SELECT *
2 FROM
3 XmlTable(
4 'for $i in //entry/title
5 return $i/text()'
6 PASSING HttpUriType('http://atsu-log.way-nifty.com/today_s_menu/atom.xml').getXML()
7* )
SCOTT> /

レコードが選択されませんでした。

これまた失礼。名前空間を指定し忘れたのでヒットしなかったようですね。
奥さんのブログのATOM FEEDは、version="0.3"で"1.0"のATOMとは名前空間が違う。。。ソースを確認して。。。

はい、できました〜〜。

SCOTT> l
1 SELECT *
2 FROM
3 XmlTable(
4 XmlNamespaces(
5 'http://purl.org/dc/elements/1.1/' as "dc",
6 default 'http://purl.org/atom/ns#'
7 ),
8 'for $i in //entry/title
9 return $i/text()'
10 PASSING HttpUriType('http://atsu-log.way-nifty.com/today_s_menu/atom.xml').getXML()
11* )
SCOTT> /

COLUMN_VALUE
--------------------------------------------------------------------------------
酢豚
スイートポテト
白身魚のホイル焼き
ミネストローネ
一足お先に乾杯!
おいなりさん
ミルク寒天
そぼろご飯
産まれました♪
麻婆豆腐

10行が選択されました。

SCOTT>

Oracle11g R1以降、Oracleデータベース内から外部のWebサービスを利用する際にはACLによる細かなアクセス制御が必要になるので忘れないようにしないと! => 備忘録。

ということで2回連続で脱線してしまったが、次回からはまたOracle XML DBのXQueryを使っていろいろと試してみるか。

| |

トラックバック


この記事へのトラックバック一覧です: Oracle de XMLDB #9 - またまた少々脱線の続き:

コメント

コメントを書く