[pgsql-jp: 41302] Re: viewを経由したINSERT処理について

takart32 @ yahoo.co.jp takart32 @ yahoo.co.jp
2012年 12月 7日 (金) 11:29:04 JST


佐藤様
ご教授いただきありがとうございます。
> 上記では、ent01.TM_SAMPLE ビューに対してDO INSTEAD NOTHING ルールを定
> 義しているので、ビューに対するINSERT コマンドの実行が無効化されている
> だけです。
 →勉強不足で申し訳ございません。NOTHING指定だとINSERT処理を無効化して
  しまうのですね。マニュアルをよく読んでませんでした。
 
  マニュアルの中で、「DO INSTEAD INSER構文」と定義することで、指定した
  特定のINSERT処理については実行できるところまでは確認致しました。
  が、今回やりたいどんなINSERT処理についてもエラーとならず実行できる
  汎用的な設定については、記述がございませんでした。
  「全てのINSERT構文の実行を許す」的なルールは作成できるのでしょうか?
  Notifyに関する記述もあり試してみましたがNGでした。
  CREATE RULE notify_me AS ON insert TO ent01.TB_SAMPLE
DO INSTEAD NOTIFY TB_SAMPLE;
  勉強不足で至らない点が多く申し訳ございませんが宜しくお願い致します。
以上


----- Original Message -----
> From: Tomoaki Sato <sato @ sraoss.co.jp>
> To: takart32 @ yahoo.co.jp; pgsql-jp @ ml.postgresql.jp
> Cc: 
> Date: 2012/12/6, Thu 23:40
> Subject: Re: [pgsql-jp: 41300] viewを経由したINSERT処理について
> 
> 佐藤です。
> 
>>  高橋と申します
>> 
>>  viewを経由したinsert処理ができず困っています。
>>  権限の設定が足りてない等、ご教授いただきたくお願い致します。
>> 
>>  <環境>
>>  ・OS:Linux
>>  ・Postgresバージョン:9.1
>>  ・DBの文字コード:UTF-8
>>  <設定手順>
>>  【手順1】以下のユーザを作成
>>   →ent01、ent02
>>   →enterprisedb(スーパーユーザ)
>>  【手順2】スキーマ作成
>>   →「enterprisedb」ユーザで「ent01」スキーマを作成
>>   →「enterprisedb」ユーザで「ent02」スキーマを作成
>>  【手順3】テーブル作成
>>   →「enterprisedb」ユーザでpsqlにログインし、以下のテーブルを作成
>>     create table entr02.TB_SAMPLE;
>>  【手順4】view作成
>>   →「enterprisedb」ユーザでpsqlにログインし、以下のviewを作成
>>     create view ent01.TB_SAMPLE as select * from ent02.TB_SAMPLE;
>>  【手順5】権限設定
>>   以下の権限を設定
>>   →grant all privileges on schema ent01 to ent01;
>>   →grant all privileges on schema ent02 to ent02;
>>   →grant all privileges on schema ent02 to ent01;
>>   →grant all privileges on schema ent01 to ent02;
>>   →alter default privileges in schema ent01 grant all on tables to ent01;
>>   →alter default privileges in schema ent02 grant all on tables to ent02;
>>   →alter default privileges in schema ent02 grant all on tables to ent01;
>>   →alter default privileges in schema ent01 grant all on tables to ent02;
>>  【手順6】ルール設定
>>   以下のルールを設定
>>   →「enterprisedb」ユーザでpsqlにログインし、以下のviewを作成
>>     create rule rule1 as on insert to ent01.TB_SAMPLE do instead nothing;
>>    ※inseteadの後に特定のinsert文を入れるのでなく、nothingにして汎
>>        用的にinsert文を使用する。
>>    ※このruleを設定しなかった場合、insert時にエラーとなり、HINTで無
>>        条件のON INSERT DO INSTEADルールもしくはINSTEAD OF INSERTトリ
>>        ガーが必要ですが出力される。
>>  以上の手順を踏まえれば、ent02スキーマ内に作成したTB_SAMPLEテーブルを、
>>  ent01スキーマ内に作成したTB_SAMPLEビュー経由でinsert処理が行える想定
>>  でした。が、実際にent01ユーザでpsqlにログインして以下のinsert文を発行
>>  したところ、、
>>  insert into TB_SAMPLE values ('値',''値');
>>  INSERT 0 0
>>  権限エラーにはなりませんが、insert結果0件でデータベースに書き込みされ
>>  ませんでした。
> 
> PostgreSQL の場合には、Oracle と違って単純なビューでもルールを定義しな
> いと、ビューに対する更新はビューの対象となるテーブルに対して実行されま
> せん。
> 
> 上記では、ent01.TM_SAMPLE ビューに対して DO INSTEAD NOTHING ルールを定
> 義しているので、ビューに対する INSERT コマンドの実行が無効化されている
> だけです。
> 
> ビューの更新については PostgreSQL のドキュメントを参照してみてください。
> 
>   http://www.postgresql.jp/document/9.2/html/rules-update.html
> 
>>  設定漏れ等がございましたらご教授いただきたくお願い致します。
>>  文章の説明で分かりづらいとは思いますが宜しくお願い致します。
> 
> 
> ----
> Tomoaki Sato <sato @ sraoss.co.jp>
> SRA OSS, Inc. Japan
>


pgsql-jp メーリングリストの案内