From bca9d0cdf4257baec757b91be8a29605118ebcac Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Tue, 21 Aug 2001 00:33:28 +0000 Subject: [PATCH] Add SCM_CREDS to get owner of unix-domain socket on BSD-like systems. --- doc/FAQ_japanese | 1320 +++++++++++++------------- doc/src/FAQ/FAQ_japanese.html | 229 +++-- src/backend/libpq/auth.c | 34 +- src/backend/libpq/hba.c | 90 +- src/backend/libpq/pg_hba.conf.sample | 12 +- src/include/libpq/pqcomm.h | 3 +- src/interfaces/libpq/fe-auth.c | 74 +- src/interfaces/odbc/connection.c | 5 + src/interfaces/odbc/connection.h | 1 + 9 files changed, 1002 insertions(+), 766 deletions(-) diff --git a/doc/FAQ_japanese b/doc/FAQ_japanese index 3517bbb5a1..245df7e8bb 100644 --- a/doc/FAQ_japanese +++ b/doc/FAQ_japanese @@ -1,225 +1,195 @@ -PostgreSQL(ポストグレス・キュー・エル)についてよくある質問(FAQ) +PostgreSQL(ポストグレス・キュー・エル)についてよくある質問とその解答(FAQ) -原文最終更新日: Mon Apr 9 15:27:47 EDT 2001 +原文最終更新日: Tue Jul 10 21:01:47 EDT 2001 現在の維持管理者: Bruce Momjian (pgman@candle.pha.pa.us) この文書の最新版は http://www.PostgreSQL.org/ で見ることができます。 -プラットホームに特有の質問については:http://www.PostgreSQL.org/users-lounge/ -docs/faq.html +プラットホームに特有の質問については +:http://www.PostgreSQL.org/users-lounge/docs/faq.html に回答があります。 +(以下、訳者による注釈を [訳注: と ] とで囲んで記します。) [訳注: - (以下、訳者による注釈を [訳注: と ] とで囲んで記します。) + 日本語版製作についてのメモは最後尾へ移動しました。 - http://www.PostgreSQL.org/ にアクセスすると http://postgresql.nucba.ac.jp/ -にリダイレクトされ、"Not Found" になってしまうことがあります。その場合は、 - http://www.PostgreSQL.org/index.html - にアクセスしてみてください。 + 日本語版のこの文書は "User's Lounge" の "Collection of FAQs" の + "Japanese" という見出しのところにあります。 + (http://www.PostgreSQL.org/docs/faq-japanese.html) - - 日本語版の製作については以下の通りです。 - - 最終更新日: 2001年04月15日 - 翻訳者: 桑村 潤 (Jun Kuwamura ) - - このFAQの和訳の作成にあたり協力をしてくださった方々(敬称は略させていただきます): - - 田仲 稔(Minoru Tanaka ) - 石井 達夫(Tatsuo Ishii ) - 齊藤 知人(Tomohito Saitoh ) - 馬場 肇(Hajime Baba ) - 岡本 一幸(Kazuyuki Okamoto ) - 小菅 昭一(Shoichi Kosuge ) - 山下 義之(Yoshiyuki Yamashita ) - 境 真太郎(Sintaro Sakai ) - 生越 昌己(Masami Ogoshi ) - 石川 俊行(Toshiyuki Ishikawa ) - 本田 茂広(Shigehiro Honda ) - せせ じゅん(Jun Sese ) - - をはじめ、ポストグレスに関する話題豊富な日本語ポストグレス・メーリングリスト、 - 和訳のきっかけを作ってくれた JF(Linux Japanese FAQ Mailing List)プロジェクト、その他、 - 直接あるいは間接的にかかわっているすべてのオープンソースコミュニティーの - 皆さんに感謝します。 - - 日本語版のこの文書はhttp://www.PostgreSQL.org/users-lounge/docs/faq-japanese.htmlにあるほか, - 以下のサイトからもたどれます。 - http://www.jp.postgresql.org/ - http://www.rccm.co.jp/~juk/pgsql/ - http://www.sra.co.jp/people/t-ishii/PostgreSQL/doc-jp/ - http://www.linux.or.jp/JF/ - - なお、この和訳に関するご意見は(juk@jp.postgresql.org)までお寄せ下さい。 + この和訳についてお気づきの点は(juk@jp.postgresql.org)までメールでお寄せ下さい。 ] + ------------------------------------------------------------------------ -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - 一般的な質問 + 一般的な質問 1.1) PostgreSQLとは何ですか? 1.2) PostgreSQLの著作権はどうなってますか? 1.3) PostgreSQLの動作するUnixプラットホームは? 1.4) Unix以外の移植版で使えるものは? -1.5) PostgreSQLはどこから手に入りますか? +1.5) PostgreSQLはどこから入手できますか? 1.6) サポートはどこで受けられますか? -1.7) 最新版は何ですか +1.7) 最新版はどれですか 1.8) どのような文書がありますか? -1.9) 既知のバグや無い機能はどうやって見つけますか? +1.9) 既知のバグや未だ無い機能はどうやって見つけますか? 1.10) SQLはどうすれば学べますか? 1.11) PostgreSQLは西暦2000年問題(Y2K)に対応していますか? 1.12) 開発チームにはどのように参加しますか? 1.13) バグレポートはどのように発信しますか? 1.14) 他のDBMSのと比べてPostgreSQLはどうなのですか? - ユーザー・クライアントの質問 + ユーザー・クライアントの質問 2.1) PostgreSQL の ODBC ドライバーはありますか? 2.2) PostgreSQL を Web ページと連携させるにはどんなツールがありますか? -2.3) PostgreSQL はグラフィカル・ユーザインターフェースを持ちますか?リポートジ -ェネレータは?埋め込み問い合わせ言語インターフェースは? +2.3) PostgreSQL にグラフィカル・ユーザインターフェースはありますか? レポー +トジェネレータは? 埋め込み問い合わせ言語インターフェースは? 2.4) PostgreSQL と通信するにはどんな言語が使えますか? - 管理上の質問 + 管理上の質問 3.1) どのようにすれば /usr/local/pgsql 以外の場所にインストールできますか? -3.2) postmaster を走らせると、 Bad System Call とかコア・ダンプしたとのメッセー -ジが出ます。なぜですか? -3.3) postmaster を走らせようとすると、 IpcMemoryCreate エラーが出ます。なぜです -か? -3.4) postmasterを走らせようとすると、 IpcSemaphoreCreate エラーが出ます。なぜで -すか? -3.5) 他のホストから自分のPostgreSQLデータベースへのアクセスを防ぐにはどうします -か? +3.2) postmaster を走らせると、 Bad System Call とかコア・ダンプしたとのメッ +セージが出ます。なぜですか? +3.3) postmaster を走らせようとすると、 IpcMemoryCreate エラーが出ます。なぜ +ですか? +3.4) postmasterを走らせようとすると、 IpcSemaphoreCreate エラーが出ます。な +ぜですか? +3.5) 他のホストから自分のPostgreSQLデータベースへのアクセスを防ぐにはどうし +ますか? 3.6) なぜ、他のマシンから自分のデータベースに接続できないのでしょうか? -3.7) より良い性能を得るためには、データベース・エンジンをどのように調整すれば良 -いですか? +3.7) より良い性能を得るためには、データベース・エンジンをどのように調整すれ +ば良いですか? 3.8) どのようなデバグ機能が使えますか? 3.9) 接続しようとするときに 'Sorry, too many clients' が出ます。なぜですか? -3.10) 自分のデータベース・ディレクトリにある pg_sorttemp.XXX ファイルは何ですか -? +3.10) 自分のデータベース・ディレクトリにある pg_sorttemp.XXX ファイルは何で +すか? - 操作上の質問 + 操作上の質問 4.1) なぜ、システムはカンマや小数点や日付フォーマットで混乱するのですか? -4.2) バイナリ・カーソルと通常のカーソルとの厳密な違いは何ですか? +4.2) バイナリ・カーソルと通常カーソルとの厳密な違いは何ですか? 4.3) 最初の数行のみを select するにはどうしますか? 4.4) テーブルやその他の情報のリストを psql で見るにはどうしますか? -4.5) テーブルからの列の削除はどのようにしますか? +4.5) テーブルから列の削除はどのようにしますか? 4.6) 行、テーブル、データベースの最大サイズは? -4.7) 一般的なテキストファイルからデータを保存するには、データベースのディスク容 -量はどのくらい必要ですか? -4.8) データベース内に定義されたテーブルやインデックスをどのように見つけ出します -か? -4.9) 問い合わせが遅いうえ、インデックスを使っている様子がありません。なぜですか -? -4.10) 問い合わせオブティマイザがどのように問い合わせを評価するかを見るにはどう -しますか? +4.7) 一般的なテキストファイルからデータを保存するには、 データベースのディス +ク容量はどのくらい必要ですか? +4.8) データベース内に定義されたテーブルやインデックスをどのようにして見つけ +出しますか? +4.9) 問い合わせが遅いうえ、インデックスを使っている様子がありません。なぜで +すか? +4.10) 問い合わせオブティマイザがどのように問い合わせを評価するかを見るにはど +うしますか? 4.11) R-tree インデックスとは何ですか? 4.12) 遺伝的問い合わせ最適化とは何ですか? -4.13) 正規表現での検索や大文字と小文字とを区別しない正規表現検索はどのように実 -現しますか? -4.14) 問い合わせの中で、フィールドが NULL であることを検出するにはどうしますか -? +4.13) 正規表現での検索や大文字と小文字とを区別しない正規表現検索はどのように +実現しますか?大文字と小文字とを区別しない検索のためのインデックスはどのよう +に使いますか? +4.14) 問い合わせの中で、フィールドが NULL であることを検出するにはどうします +か? 4.15) 色々な文字型のそれぞれの違いは何ですか? 4.16.1) 通番(serial)/自動増分フィールドはどのようにつくりますか? -4.16.2) SERIALインサートの値はどうすれば得られますか? -4.16.3) 他のユーザとの競合状態を避けるためには、currval() と nextval() は使わな -いほうがよいのでしょうか? +4.16.2) SERIALデータ型に挿入される値は、どうすれば得られますか? +4.16.3) 他のユーザとの競合状態を避けるためには、currval() と nextval() は使 +わないほうがよいのでしょうか? 4.17) OID とは何ですか? TID とは何ですか? 4.18) PostgreSQL で使われるいくつかの用語の意味は何ですか? -4.19) エラーメッセージ "ERROR: Memory exhausted in AllocSetAlloc()"が出るのはな -ぜですか? -4.20) どのバージョンの PostgreSQL を走らせているのかを調べるにはどうしますか? -4.21) ラージオブジェクトの操作で、invalid large obj descriptorと出ます。なぜで -すか? +4.19) エラーメッセージ "ERROR: Memory exhausted in AllocSetAlloc()"が出るの +はなぜですか? +4.20) どのバージョンの PostgreSQL を走らせているのかを調べるにはどうします +か? +4.21) ラージオブジェクトの操作で、invalid large obj descriptorと出ます。なぜ +ですか? 4.22) 現在の時刻がデフォルトとなるような列はどのようにつくりますか? 4.23) なぜ、INを使う副問い合わせがとても遅いのですか? 4.24) 外部結合(outer join)はどのように実現しますか? - PostgreSQLの拡張についての質問 + PostgreSQLの拡張についての質問 -5.1) 自分で書いたユーザ定義関数を psql の中で実行するとコア・ダンプしてしまうの -はなぜですか? -5.2) PostgreSQL 用に書いた粋な新しい型や関数は、どうすれば寄贈できますか? +5.1) 自分で書いたユーザ定義関数を psql の中で実行するとコア・ダンプしてしま +うのはなぜですか? +5.2) PostgreSQL 用に書いたちょっと素敵な新しい型や関数を提供してプロジェクト +に貢献したいのですが? 5.3) タプルを返す C言語の関数はどのように書きますか? -5.4) ソース・ファイルを変更しました。再コンパイルしても変化が見られないのはなぜ -ですか? +5.4) ソース・ファイルを変更しました。再コンパイルしても変化が見られないのは +なぜですか? -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - 一般的な質問 + ------------------------------------------------------------------------ + + 一般的な質問 1.1) PostgreSQL とは何ですか? -PostgreSQL は POSTGRES データベース管理システムの改良版で、次世代 DBMS 研究用の -プロトタイプです。PostgreSQL は POSTGRES の強力なデータ・モデルと豊富なデータ・ -タイプ(型)を内包しつつ、POSTGRES で使われた PostQuel 問い合わせ言語を、拡張した -SQL のサブセットに置き換えています。PostgreSQL は無料で完全なソースを利用できま -す。 +PostgreSQL は次世代 DBMS 研究用のプロトタイプであった POSTGRES データベース +管理システムの改良版です。PostgreSQL は POSTGRES の強力なデータ・モデルと豊 +富なデータ・タイプ(型)を保持しながら、POSTGRES で使われた PostQuel 問い合わ +せ言語を、拡張した SQL のサブセットに置き換えています。PostgreSQL は無料で完 +全なソースを利用できます。 -PostgreSQL のすべての開発は、PostgreSQL 開発メーリングリストに参加しているイン -ターネット上の開発者チームで行なっています。現在の座長は Marc G. Fournier ( -scrappy@PostgreSQL.org )です。(以下に参加の仕方があります。)現在、このチームが -PostgreSQL開発のすべての面倒を見ます。 +PostgreSQL の開発は、PostgreSQL 開発メーリングリストに参加しているインターネ +ット上の開発者チームですべて行なわれています。現在の座長は Marc G. Fournier +( scrappy@PostgreSQL.org )です。(以下に参加の仕方があります。)現在、このチー +ムが PostgreSQL 開発のすべての面倒をみています。 -PostgreSQL 1.01 の著者は Andrew Yu と Jolly Chen でした。その他大勢の人々がこの -コードの移植、テスト、デバグ、および、改良に貢献しました。PostgreSQL の派生元コ -ードである POSTGRES はカリフォルニア大学バークレイ校において、 Michael -Stonebraker 教授の指揮のもと、多くの学生、卒業生、職業プログラマたちの努力によ -り作られました。 +Postgres95-1.01 の中心的な開発者は Andrew Yu と Jolly Chen でしたが、その他 +大勢の人々がこのコードの移植、テスト、デバグ、および、改良に参加しました。 +PostgreSQL の派生元コードである POSTGRES はカリフォルニア大学バークレイ校に +おいて、 Michael Stonebraker 教授の指揮のもと、多くの学生、卒業生、本職のプ +ログラマたちの努力により作られました。 -バークレイにおけるこのソフトウェアのもとの名前は Postgres でした。SQL の機能が -追加された 1995 年にその名前は Postgres95 に変更されました。1996 年の終りにその -名前は PostgreSQL に変更されました。 Post-Gres-Q-L.(ポスト - グレス - キュー - -エル) と発音します。 +バークレイにおけるこのソフトウェアのもとの名前は Postgres でしたが、SQL の機 +能が追加された 1995 年にその名前は Postgres95 に変更され、1996 年の終りにそ +の名前は PostgreSQL に変更されました。 Post-Gres-Q-L.(ポスト - グレス - キュ +ー - エル) と発音します。 1.2) PostgreSQL の著作権はどうなってますか? PostgreSQL は下記の著作権に従います。 + [訳注: 正文は英語です。参考として、訳文を併記掲載します。 ] - PostgreSQL Data Base Management System -Portions copyright (c) 1996-2000, PostgreSQL Global Development Group Portions -Copyright (c) 1994-6 Regents of the University of California +Portions Copyright (c) 1996-2000, PostgreSQL Global Development Group +Portions Copyright (c) 1994-6 Regents of the University of California Permission to use, copy, modify, and distribute this software and its -documentation for any purpose, without fee, and without a written agreement is -hereby granted, provided that the above copyright notice and this paragraph and -the following two paragraphs appear in all copies. +documentation for any purpose, without fee, and without a written agreement +is hereby granted, provided that the above copyright notice and this +paragraph and the following two paragraphs appear in all copies. IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR -DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST -PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF -THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING +LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, +EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. -THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND -THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, -SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN +"AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. POSTGRESQL データベース管理システム 部分的著作権 (c) 1996-2001, PostgreSQL国際開発チーム 部分的著作権 (c) 1994-6 カリフォルニア大学本校 - 本ソフトウェアおよびその文書一式は上記の著作権表示と、この文章 およびこれに続く二つの段落が全ての複製に添付されている限りにおい て、使用、複製、修正および配付の許可を、いかなる目的であっも、無 償でかつ同意書無しに行なえることをここに認めます。 - + カリフォルニア大学は、いかなる当事者にたいしても、利益の壊失を 含む、直接的、間接的、特別、偶然あるいは必然的にかかわらず生じた 損害について、たとえカリフォルニア大学がこれらの損害について訴追 を受けていたとしても、一切の責任を負いません。 - + カリフォルニア大学は、商用目的における暗黙の保証と、特定目的で の適合性に関してはもとより、これらに限らず、いかなる保証も放棄す ることを明言します。以下に用意されたソフトウェアは「そのまま」を @@ -231,43 +201,42 @@ SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 参考です。 ] - 1.3) PostgreSQL の動作環境は? -著者らは PostgreSQL のコンパイルとテストを次のプラットホーム上で行ないました。 -(これらのうちのいくつかはコンパイルに gcc が必要です): +著者らは PostgreSQL のコンパイルとテストを次のプラットホーム上で行ないまし +た。(これらのうちのいくつかはコンパイルに gcc が必要です): -一般的に、最近のUnix互換プラットホームならばPostgreSQLをはしらせられるはずです -。リリースの時点で実際にテストを行なったことの報告がなされたプラットホームにつ -いてはインストール手引書に列挙してあります。 +一般的に、最近のUnix互換プラットホームならばPostgreSQLをはしらせられるはずで +す。リリースの時点で実際にテストを行なったことの報告がなされたプラットホーム +についてはインストール手引書に列挙してあります。 1.4) Unix以外の移植版で使えるものは? クライアント -MS Windows プラットホーム上で、libpq C ライブラリ、psql、それとその他のインター -フェースはコンパイル可能で、バイナリーが走ります。この場合、クライアントを MS -Windows 上で走らせて、TCP/IP 経由でサポートされている Unix プラットホーム上で走 -るサーバと通信します。 +MS Windows プラットホーム上で、libpq C ライブラリ、psql、それとその他のイン +ターフェースは コンパイル可能で、バイナリーが走ります。この場合、クライアン +トを MS Windows 上で走らせて、TCP/IP 経由でサポートされている Unix プラット +ホーム上で走るサーバと通信します。 Win32 libpq ライブラリと psql を作るために、win31.mak が配布に含まれてます。 PostgreSQLは ODBC クライアントとも通信できます。 サーバ -現在、Cygnus Unix/NT 移植ライブラリの Cygwin を使って、PostgreSQL データベース -サーバは Windows NT と Win2k 上で稼働しています。配布に含まれるpgsql/doc/ -FAQ_MSWINあるいはウェブサイトにある MS Windows FAQ をご覧下さい。Microsoft の素 -のプラットホームに移植する計画はありません。 +現在、Cygnus Unix/NT 移植ライブラリの Cygwin を使って、PostgreSQL データベー +スサーバは Windows NT と Win2k 上で稼働しています。配布に含まれる +pgsql/doc/FAQ_MSWINあるいはウェブサイトにある MS Windows FAQ をご覧下さい。 +Microsoft の素のプラットホームに移植する計画はありません。 -1.5) PostgreSQL はどこから手に入りますか? +1.5) PostgreSQL はどこから入手できますか? PostgreSQL の元の anonymous ftp サイトです: - - - ・ ftp://ftp.PostgreSQL.org/pub/ + + * ftp://ftp.PostgreSQL.org/pub/ ミラーサイトについては、我々のメイン Web ページをご覧下さい。 + [訳注: 以下は日本のミラーサイトです: @@ -285,44 +254,47 @@ PostgreSQL Japan: ftp://ring.aist.go.jp/pub/misc/db/postgresql/ ] - 1.6) サポートはどこで受けられますか? -主要なメーリング・リストは: pgsql-general@PostgreSQL.orgです。PostgreSQL に関す -ることであれば議論ができます。このリストへの参加のは、電子メールの本文(Subject -行ではありません)に次の2行を書いて、 +主要なメーリング・リストは: pgsql-general@PostgreSQL.orgです。PostgreSQL に +関することであれば議論ができます。このリストへの参加のは、電子メールの本文 +(Subject 行ではありません)に次の2行を書いて、 + subscribe end pgsql-general-request@PostgreSQL.org へ送って下さい。 -ダイジェスト版のメーリング・リストもあります。このリストへの参加は "本文"に: +ダイジェスト版のメーリング・リストもあります。このリストへの参加は "本文" +に: + subscribe end -と書いて pgsql-general-digest-request@PostgreSQL.org へ電子メールを送って下さい -。 -ダイジェスト版は、メインリストが受信するメッセージ 30k 程度溜る毎にダイジェスト -版リストのメンバーに送付されます。 +と書いて pgsql-general-digest-request@PostgreSQL.org へ電子メールを送って下 +さい。 -バグのメーリングリストも利用できます。このリストへの参加は "本文"といっしょに: -bugs-request@PostgreSQL.org へ電子メールを送って下さい。 +ダイジェスト版は、メインリストで受信するメッセージが 30k 程度溜る毎にダイジ +ェスト版リストのメンバーに送付されます。 -開発者の議論のためのメーリングリストも利用できます。このリストへの参加は電子メ -ールの本文に: +バグレポート用のメーリングリストもあります。このリストへの参加は "本文"とい +っしょに: bugs-request@PostgreSQL.org へ電子メールを送って下さい。 + +開発者の議論のためのメーリングリストも利用できます。このリストへの参加は電子 +メールの本文に: subscribe end と書いて、pgsql-hackers-request@PostgreSQL.orgへ電子メールを送って下さい。 -PostgreSQL についてもっと詳しく知りたければ、次の postgreSQL WWWホームページか -らたどれます: - - http://www.PostgreSQL.org +PostgreSQL についてもっと詳しく知りたければ、次の postgreSQL WWWホームページ +からたどれます: -IRC チャンネルも EFNet にあります。そのチャンネルは #PostgreSQL です。 unix コ -マンドでirc -c '#PostgreSQL' "$USER" irc.phoenix.net を使います。 + http://www.PostgreSQL.org + +EFNet に #PostgreSQL という IRC チャンネルもあります。 unix コマンドでirc -c +'#PostgreSQL' "$USER" irc.phoenix.net を使います。 [訳注: 1999年7月23日、日本PostgreSQLユーザー会(にほん ぽすとぐれす ゆーざー かい)、略称JPUGが設立されました。 @@ -337,28 +309,27 @@ IRC で検索することもできます。 ] +商用サポート会社のリストは +http://www.postgresql.org/users-lounge/commercial-support.htmlにあります。 -商用サポート会社のリストはhttp://www.postgresql.org/users-lounge/ -commercial-support.htmlにあります。 [訳注: 日本では、SRA Inc. オープンシステム事業部 にて商用サポートが行なわれています。 ミラクル・リナックス株式会社 で "Miracle Linux for PostgreSQL" の販売とサポートが 開始されました。 ] +1.7) 最新版はどれですか -1.7) 最新版は何ですか - -PostgreSQL の最新版はバージョン 7.0.3 です。 +PostgreSQL の最新版はバージョン 7.1.2 です。 我々は、4カ月毎にメジャーリリースを行なうことを計画しています。 1.8) どのような文書がありますか? -配付の中に、いくつかのマニュアルとオンライン・マニュアル(マニュアル・ページ)お -よびいくつかの小さなテスト例題が含まれます。/doc ディレクトリをご覧下さい。また -、オンラインでのマニュアルを、 http://www.PostgreSQL.org/users-lounge/docs/ で -も閲覧できます。 +配付の中に、いくつかのマニュアルとオンライン・マニュアル(マニュアル・ページ) +およびいくつかの小さなテスト例題が含まれます。/doc ディレクトリをご覧下さ +い。また、マニュアルは、 http://www.PostgreSQL.org/users-lounge/docs/ でオン +ラインでも閲覧できます。 PostgreSQL の本もあります。 http://www.PostgreSQL.org/docs/awbook.html @@ -367,31 +338,30 @@ PostgreSQL 翻訳作業が進行中。 ] - -psql も、型、演算子、関数、集約、その他の情報をお見せする、いくつかの素晴らしい -\d コマンドを持ちます。 +psql も、型、演算子、関数、集約、その他の情報をお見せする、いくつかの素晴ら +しい \d コマンドを持ちます。 我々の Web サイトには、もっと沢山の文書があります。 -1.9) 既知のバグや無い機能はどうやって見つけますか? +1.9) 既知のバグや未だ無い機能はどうやって見つけますか? -PostgreSQLは拡張されたSQL-92のサブセットをサポートします。我々のページの TODO -リストに、既知のバグや欠落機能や将来計画についての記述があります。 +PostgreSQLは拡張されたSQL-92のサブセットをサポートします。 我々のページの +TODO リストに、既知のバグや欠落機能や将来計画についての記述があります。 -1.10) SQL はどのように学べば良いですか? +1.10) SQL はどうすれば学べますか? -http://www.PostgreSQL.org/docs/awbook.html にあるPostgreSQL本で SQL を教えてい -ます。 +http://www.PostgreSQL.org/docs/awbook.html にあるPostgreSQL本で SQL を教えて +います。 -素晴らしい学習書には、 http://w3.one.net/~jhoffman/sqltut.htm と http:// -ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM. +素晴らしい学習書には、 http://w3.one.net/~jhoffman/sqltut.htm と +http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM. -とがあります。その他に、 "Teach Yourself SQL in 21 Days, Second Edition" が、 -http://members.tripod.com/er4ebus/sql/index.htm にあります。 +とがあります。その他に、 "Teach Yourself SQL in 21 Days, Second Edition" +が、 http://members.tripod.com/er4ebus/sql/index.htm にあります。 多くのユーザに、 The Practical SQL Handbook, Bowman Judith S. et al., -Addison-Wesley が好評です。その他に、The Complete Reference SQL, Groff et al., -McGraw-Hill のようなのもあります。 +Addison-Wesley が好評です。 その他に、The Complete Reference SQL, Groff et +al., McGraw-Hill のようなのもあります。 [訳注: 石井達夫氏による日本語の参考文献の紹介ページ @@ -410,114 +380,114 @@ McGraw-Hill 1.11) PostgreSQLは西暦2000年問題(Y2K)に対応していますか? -対応してます。西暦2000年より後の日付も、紀元前2000年より前の日付も、簡単に扱え -ます。 +対応してます。西暦2000年より後の日付も、紀元前2000年より前の日付も、簡単に扱 +えます。 1.12) 開発チームにはどのように参加しますか? -まず最初(1番目)に、最新のソースをダウンロードし、我々の Web サイトか配布に含ま -れている PostgreSQL Developersの文書を読みます。2番目に、pgsql-hackers と -pgsql-patches メーリング・リストを購読(subscribe)します。3番目に、高品質のパッ -チをpgsql-patchesに発信します。およそ十人ちょっとの人達が、PostgreSQL CVSアーカ -イブにコミットする権限を持っています。そのそれぞれの人達が沢山の高品質なパッチ -を発信するので、現在コミッターとなっている人達はそれに追い付くのが大変ですが、 -我々は彼らがコミットしたパッチは高品質であると確信しています。 +まず最初(1番目)に、最新のソースをダウンロードし、我々の Web サイトか配布に +含まれている PostgreSQL Developersの文書を読みます。 2番目に、pgsql-hackers +と pgsql-patches メーリング・リストを購読(subscribe)します。 3番目に、高品 +質のパッチをpgsql-patchesに発信します。 およそ十人ちょっとの人達が、 +PostgreSQL CVSアーカイブにコミットする権限を持っています。 そのそれぞれの人 +達が沢山の高品質なパッチを発信するので、現在コミッターとなっている人達はそれ +に追い付くのが大変ですが、我々は彼らがコミットしたパッチは高品質であると確信 +しています。 1.13) バグレポートはどのように発信しますか? -"bug-template" ファイルの項目を満たして、pgsql-bugs@PostgreSQL.orgに送って下さ -い。 +"bug-template" ファイルの項目を満たして、pgsql-bugs@PostgreSQL.orgに送って下 +さい。 その前に http://postgreSQL.orgにある最新の FAQ をチェックして下さい。 -それと同時に ftp サイト ftp://ftp.postgreSQL.org/pub/で、もっと新しいバージョン -の PostgreSQL あるいはパッチをさがしてみて下さい。 +それと同時に ftp サイト ftp://ftp.postgreSQL.org/pub/で、もっと新しいバージ +ョンの PostgreSQL あるいはパッチをさがしてみて下さい。 1.14) 他のDBMSのと比べてPostgreSQLはどうなのですか? -ソフトウェアを計る方法にはいくつかあります。機能と性能と信頼性とサポートと価格 -です。 +ソフトウェアを計る方法にはいくつかあります。機能と性能と信頼性とサポートと価 +格です。 機能(Features) - PostgreSQLは、トランザクション、副問い合わせやトリガーやビューや外部キー参 - 照や、そして、洗練されたロック機構など、大規模商用DBMSが持つ機能をほとんど - 持っています。PostgreSQLは、さらに、ユーザ定義型や継承やマルチ- バージョン - ・コンテンションなど、商用DBMSが持ち合わせない機能をいくつか持ち合わせてい - ます。外部キーの参照整合性(foreign key referential integrity)やロック・コン - テンションを減らすための外部競合状態制御 (outer concurrency control)は持ち - 合わせません。 - - + PostgreSQLは、トランザクション、副問い合わせやトリガーやビューや外部キ + ー 参照や、そして、洗練されたロック機構など、大規模商用DBMSが持つ機能を + ほ とんど持っています。PostgreSQLは、さらに、ユーザ定義型や継承やマルチ + - バージョン・コンテンションなど、商用DBMSが持ち合わせない機能をいくつ + か 持ち合わせています。外部キーの参照整合性(foreign key referential + integrity)やロック・コンテンションを減らすための外部競合状態制御 (outer + concurrency control)は持ち合わせません。 + 性能(Performance) - PostgreSQLは二つのモードで走ります。普通のfsyncモードは、OSがクラッシュした - り、数秒後に電源が落ちたりしたときのために、トランザクションが完了する毎に - ディスクに書き込み、すべてのデータをディスクに保存します。このモードでは、 - ほとんどの商用データベースよりも遅くなりますが、その部分的な理由として、商 - 用のデータベースの中にはこのように保守的なディスク書き込みをデフォルトとし - ているものが少ないということもあります。 no-fsyncモードで、普通、PostgreSQL - は商用データベースよりも速くなりますが、しかしながら、OSのクラッシュでデー - タが破壊されるかもしれません。我々は、その中間モードを開発中で、それがうま - くゆくと、完全fsync モードほど性能を犠牲にすることなく、OSがクラッシュする - 30秒前までのデータ整合性を保てるようになります。 - - MySQLなどの特化型データベース・システムにくらべて、PostgreSQLの挿入/更新が - 遅いのは、トランザクションによるオーバーヘッドがあるからです。もちろん、 - MySQLには上記のFeaturesの節に示すような機能はまったくありません。我々は、 - PostgreSQLに柔軟性と機能性を組み込みながらも、絶えず、プロファイラーに掛け - たりソースコードを解析したりして、性能の改善を続けています。PostgreSQL と - MySQL とを比較している面白い Web ページが http://openacs.org/ - why-not-mysql.html にあります。 - - PostgreSQLは、Unixプロセスを起動することによりユーザー接続を操作します。複 - 数のバックエンド・プロセスが情報をロックしながらデータ・バッファーを共有し - ます。マルチCPUでは、簡単に複数のバックエンドをそれぞれのCPUで走らせること - ができます。 - - + PostgreSQLは二つのモードで走ります。普通のfsyncモードは、OSがク ラッシ + ュしたり、数秒後に電源が落ちたりしたときのために、トランザクショ ンが完 + 了する毎にディスクに書き込み、すべてのデータをディスクに保存しま す。こ + のモードでは、ほとんどの商用データベースよりも遅くなりますが、そ の部分 + 的な理由として、商用のデータベースの中にはこのように保守的なディ スク書 + き込みをデフォルトとしているものが少ないということもあります。 no-fsync + モードで、普通、PostgreSQLは商用データベースよりも速く なりますが、しか + しながら、OSのクラッシュでデータが破壊されるかもしれま せん。我々は、そ + の中間モードを開発中で、それがうまくゆくと、完全fsync モードほど性能を + 犠牲にすることなく、OSがクラッシュする30秒前までのデー タ整合性を保てる + ようになります。 + + MySQLなどの特化型データベース・システムにくらべて、PostgreSQLの挿入/ + 更新が遅いのは、トランザクションによるオーバーヘッドがあるからです。も + ちろん、MySQLには上記のFeaturesの節に示すような機能はまったくあ りませ + ん。我々は、PostgreSQLに柔軟性と機能性を組み込みながらも、絶えず、 プロ + ファイラーに掛けたりソースコードを解析したりして、性能の改善を続け てい + ます。PostgreSQL と MySQL とを比較している面白い Web ページが + http://openacs.org/why-not-mysql.html にあります。 + + PostgreSQLは、Unixプロセスを起動することによりユーザー接続を操作しま + す。 複数のバックエンド・プロセスが情報をロックしながらデータ・バッファ + ーを 共有します。マルチCPUでは、簡単に複数のバックエンドをそれぞれのCPU + で走 らせることができます。 + 信頼性(Reliability) - 我々は、DBMSの信頼性が高くなくてはその価値が無いことを理解してます。十分テ - ストして、安定したコードをバグを最小にしてからリリースするように勤めてます - 。それぞれのリリースは少なくとも1カ月以上のベータ・テストを行ない、これまで - のリリースの履歴が、製品版として安定した堅固なリリースであることを物語って - います。この分野では、他のデータベースと比べても遜色がないことに自信を持っ - ています。 + 我々は、DBMSの信頼性が高くなくてはその価値が無いことを理解してます。十 + 分テストして、安定したコードをバグを最小にしてからリリースするように勤 + めてます。それぞれのリリースは少なくとも1カ月以上のベータ・テストを行 + ない、これまでのリリースの履歴が、製品版として安定した堅固なリリースで + あることを物語っています。この分野では、他のデータベースと比べても遜色 + がないことに自信を持っています。 サポート(Support) - 我々のメーリングリストは、遭遇するどんな問題についても解決を助けてくれる、 - 開発者やユーザの膨大なグループを擁しています。我々は問題の解決を保証するこ - とはできませんが、商用データベースであっても常に解決されるわけではありませ - ん。開発者達、ユーザ・コミュニティ、マニュアル類、それに、ソースコードなど - に直接アクセスできることよって、PostgreSQLのサポートは、他のDBMSサポートよ - りも優れたものとなっています。御要望に答えて、事柄毎の商用サポートもありま - す(サポートFAQ項目をご覧下さい)。 + 我々のメーリングリストは、遭遇するいかなる問題についても解決への手 助け + をしてくれる、開発者やユーザの大きな集まりを提供しています。我々は 問題 + の解決を保証することはできませんが、商用データベースであっても常に 解決 + されるわけではありません。開発者や、ユーザ・コミュニティ、マニュア ル + 類、それに、ソースコードなどへ直接アクセスできることよって、 PostgreSQL + のサポートは、他のDBMSサポートよりも優れたものとなっています。 御要望に + 答えて、事柄毎の商用サポートなどもあります(サポートFAQ項目をご覧 下さ + い)。 価格(Price) - PostgreSQLの使用は、商用でも非商用でも、すべて無料です。上記に示してあるBSD - スタイルの使用許諾に外れない限り、PostgreSQLのコードを制限無しで商品に組み - 込むことができます。 - - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - ユーザー・クライアントの質問 + PostgreSQLの利用は、商用でも非商用でも、すべて無料です。上記に示してあ + るBSDスタイルの使用許諾に外れない限り、PostgreSQLのコードを制限無しで + 商品に組み込むことができます。 + + ------------------------------------------------------------------------ + + ユーザー・クライアントの質問 2.1) PostgreSQL のための ODBC ドライバーはありますか? PsqlODBC と OpenLink ODBC の二つの ODBC ドライバーが利用可能です。 -PsqlODBC は PostgreSQL の配布に含まれています。それについてのさらに詳細な情報は -ftp://ftp.PostgreSQL.org/pub/odbc/ から取得できます。 +PsqlODBC は PostgreSQL の配布に含まれています。それについてのさらに詳細な情 +報は ftp://ftp.PostgreSQL.org/pub/odbc/ から取得できます。 [訳注: PsqlODBC の 日本語パッチを片岡裕生さん(kataoka@interwiz.koganei.tokyo.jp)が作られました: ●http://www.interwiz.koganei.tokyo.jp/software/PsqlODBC/index.html ] +OpenLink ODBC は http://www.openlinksw.com/から入手できます。標準的な ODBC +クライアント・ソフトウェアで使えますので、支援しているすべてのプラットホーム +(Win, Mac, Unix, VMS)から PostgreSQL の ODBC が利用できます。 -OpenLink ODBC は http://www.openlinksw.com/から入手できます。標準的な ODBC クラ -イアント・ソフトウェアで使えますので、支援しているすべてのプラットホーム(Win, -Mac, Unix, VMS)から PostgreSQL の ODBC が利用できます。 - -たぶん彼らは、商用品質のサポートの必要な人々に売っていると思いますが、フリーウ -ェア版はいつでも入手可能のようです。質問は、postgres95@openlink.co.ukにお願いし -ます。 Programmer's Guide の ODBC の章もご覧ください。 +たぶん彼らは、商用品質のサポートの必要な人々に売っていると思いますが、フリー +ウェア版はいつでも入手可能のようです。質問は、postgres95@openlink.co.ukにお +願いします。 Programmer's Guide の ODBC の章もご覧ください。 2.2) PostgreSQL を Web ページと連携させるにはどんなツールがありますか? @@ -526,8 +496,9 @@ http://www.webtools.com http://www.phone.net/home/mwm/hotlist/にも、もう一つあります。 -Web への拡張のためには、PHP が卓越したインターフェースとなっています。http:// -www.php.net/にあります。 +Web への拡張のためには、PHP が卓越したインターフェースとなっています。 +http://www.php.net/にあります。 + [訳注: PHPに関する日本語の情報は、2000年4月19日に発足した日本PHPユーザ会のサイト http://www.php.gr.jp/ @@ -544,11 +515,8 @@ www.php.net/ 本家の方で国際化のMLも立ち上がっています。 ] +処理が複雑な場合、多くの人は Perl インターフェースと CGI.pm を使います。 -複雑な場合、多くの人は Perl インターフェースと CGI.pm を使います。 - -Perl を使った WDB を基にした WWW ゲートウェイはhttp://www.eol.ists.ca/~dunlop/ -wdb-p95からダウンロードできます。 [訳注: WDB は、Web から DataBase への Perl の Interface です。 wdb-p95 へのリンクは切れてしまっています。おそらく、Perl DBI 経由で DBD::Pg の利用が可能と思われます。 @@ -559,32 +527,30 @@ wdb-p95 とがあります。その経緯はよくわかりません。 ] +2.3) PostgreSQL にグラフィカル・ユーザインターフェースはありますか? レポー +ト・ジェネレータは? 埋め込み問い合わせ言語へのインターフェースは? -2.3) PostgreSQL はグラフィカル・ユーザ・インターフェースを持っていますか?レポ -ート・ジェネレータは?埋め込み問い合わせ言語へのインターフェースは? +pgaccess と呼ばれる素晴らしいグラフィカル・ユーザ・インターフェースがあり、 +この配布と共に出荷されます。Pgaccess にはレポート・ジェネレータもあります。 +Web ページはhttp://www.flex.ro/pgaccessです。 -pgaccess と呼ばれる素晴らしいグラフィカル・ユーザ・インターフェースがあり、この -配布と共に出荷されます。Pgaccess にはレポート・ジェネレータもあります。Web ペー -ジはhttp://www.flex.ro/pgaccessです。 - -ecpg という C 言語のための埋め込み SQL 問い合わせ言語インターフェースもあります -。 +ecpg という C 言語のための埋め込み SQL 問い合わせ言語インターフェースもあり +ます。 2.4) PostgreSQL と通信するにはどんな言語が使えますか? 以下のものがあります: - - - ・ C (libpq) - ・ C++ (libpq++) - ・ 埋め込みC (ecpg) - ・ Java (jdbc) - ・ Perl (perl5) - ・ ODBC (odbc) - ・ Python (PyGreSQL) - ・ TCL (libpgtcl) - ・ C Easy API (libpgeasy) - ・ 埋め込みHTML (PHP from http://www.php.net) + + * C (libpq) + * C++ (libpq++) + * 埋め込みC (ecpg) + * Java (jdbc) + * Perl (perl5) + * ODBC (odbc) + * Python (PyGreSQL) + * TCL (libpgtcl) + * C Easy API (libpgeasy) + * 埋め込みHTML (PHP from http://www.php.net) [訳注: rubyの作者であるまつもと ゆきひろ(matz@ZetaBITS.COM)さんと、まつもと えいじ(ematsu@pfu.co.jp)さんが @@ -593,234 +559,244 @@ ecpg PgBash は 境田 雅明 さんが作った bash の PostgreSQL インターフェースです。 http://www.psn.co.jp/PostgreSQL/pgbash/ Bashコマンドラインでpostgres に問い合わせできます。 + Perl のモジュールは古くからある Pg と DBI ドライバの DBD::Pg とがあり、 + いずれも Edmund Mergl 氏によるもので CPAN サイトにあります。 ] + ------------------------------------------------------------------------ -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - 管理上の質問 + 管理上の質問 3.1) どのようにすれば /usr/local/pgsql 以外の場所にインストールできますか? -簡単な方法は、 configure を走らせるときに --prefix オプションを指定することです -。 +簡単な方法は、 configure を走らせるときに --prefix オプションを指定すること +です。 -3.2) postmaster を走らせると、Bad System Call とかコア・ダンプしたとのメッセー -ジが出ます。なぜですか? +3.2) postmaster を走らせると、Bad System Call とかコア・ダンプしたとのメッセ +ージが出ます。なぜですか? -さまざまな問題が考えられますが、まず最初にあなたのカーネルに System V IPC の拡 -張がインストールされているかを確認して見てください。PostgreSQL はカーネルによる -共有メモリーとセマフォのサポートを必要とします。 +さまざまな問題が考えられますが、まず最初にあなたのカーネルに System V IPC の +拡張がインストールされているかを確認して見てください。PostgreSQL はカーネル +による共有メモリーとセマフォのサポートを必要とします。 -3.3) postmaster を走らせようとすると、IpcMemoryCreate エラーが出ます。なぜです -か? - -カーネルが共有メモリーを持つ設定になっていなかったか、でなければ、カーネルに対 -して使える共有メモリーの大きさを大きく設定する必要があります。具体的な大きさは -、使っているアーキテクチャとpostmaster を走らせるときに設定するバッファの数とバ -ックエンドプロセスに依存します。ほとんどのシステムでは、既定値のバッファサイズ -のままで、少なくとも約1MBが必要です。 PostgreSQL Administrator's Gide に共有メ -モリーとセマフォについての情報の詳細があります。 - -3.4) postmasterを走らせようとすると、IpcSemaphoreCreate エラーが出ます。なぜで +3.3) postmaster を走らせようとすると、IpcMemoryCreate エラーが出ます。なぜで すか? +カーネルが共有メモリーを持つ設定になっていなかったか、でなければ、カーネルに +対して使える共有メモリーの大きさを大きく設定する必要があります。具体的な大き +さは、使っているアーキテクチャとpostmaster を走らせるときに設定するバッファ +の数とバックエンドプロセスに依存します。ほとんどのシステムでは、既定値のバッ +ファサイズのままで、少なくとも約1MBが必要です。 PostgreSQL Administrator's +Gide に共有メモリーとセマフォについての情報の詳細があります。 + +3.4) postmasterを走らせようとすると、IpcSemaphoreCreate エラーが出ます。なぜ +ですか? + もしエラーメッセージがIpcSemaphoreCreate: semget failed (No space left on device)であれば、カーネルが十分なセマフォを使えるように構成されていません。 -Postgresは潜在的なバックエンドプロセス毎に一つのセマフォを必要とします。とりあ -えずの解決策はpostmasterを起動するときに、バックエンドプロセスの数をより少なく -制限をすることです。既定値の32より小さな数のパラメータを-Nで使います。より恒久 -的な解決策は、カーネルのSEMMNS と SEMMNI パラメータを増やすことです。 +Postgresは潜在的なバックエンドプロセス毎に一つのセマフォを必要とします。とり +あえずの解決策はpostmasterを起動するときに、バックエンドプロセスの数をより少 +なく制限をすることです。既定値の32より小さな数のパラメータを-Nで使います。よ +り恒久的な解決策は、カーネルのSEMMNS と SEMMNI パラメータを増やすことです。 -もし、エラーメッセージがなにか他のものであれば、カーネルの構成でまったくセマフ -ォのサポートをしていないかもしれません。 PostgreSQL Administrator's Gide に共有 -メモリーとセマフォについての情報の詳細があります。 +もし、エラーメッセージがなにか他のものであれば、カーネルの構成でまったくセマ +フォのサポートをしていないかもしれません。 PostgreSQL Administrator's Gide +に共有メモリーとセマフォについての情報の詳細があります。 -3.5) 他のホストから自分の PostgreSQL データベースへのアクセスを防ぐにはどうしま -すか? +3.5) 他のホストから自分の PostgreSQL データベースへのアクセスを防ぐにはどう +しますか? -既定値では、PostgreSQL は unix ドメインソケットを使うローカルマシンからの接続し -か許しません。postmaster 起動に -i フラッグを加え、$PGDATA/pg_hba.conf ファイル -を適切に直して、ホスト主導型の認証を使わないかぎりは他のマシンからは接続できな -いでしょう。これによりTCP/IPの接続が可能になります。 +既定値では、PostgreSQL は unix ドメインソケットを使うローカルマシンからの接 +続しか許しません。postmaster 起動に -i フラッグを加え、$PGDATA/pg_hba.conf +ファイルを適切に直して、ホスト主導型の認証を使わないかぎりは他のマシンからは +接続できないでしょう。これによりTCP/IPの接続が可能になります。 -操作不能なセマフォも過度のデータベースアクセス中にクラッシュを引き起こすことが -あります。 +操作不能なセマフォも過度のデータベースアクセス中にクラッシュを引き起こすこと +があります。 3.6) 他のマシンから自分のデータベースに接続できないのはなぜですか? -既定の設定ではローカルマシンからの unix ドメインのソケット接続しか許しません。 -TCP/IP 接続を可能にするには postmaster が -i オプションで開始されていて、pgsql/ -data/pg_hba.conf ファイルに適切なホストの記載が追加されていることを確認してくだ -さい。 +既定の設定ではローカルマシンからの unix ドメインのソケット接続しか許しませ +ん。TCP/IP 接続を可能にするには postmaster が -i オプションで開始されてい +て、pgsql/data/pg_hba.conf ファイルに適切なホストの記載が追加されていること +を確認してください。 -3.7) よりよい性能を得るために、どのようにデータベース・エンジンを調整できますか -? +3.7) より良い性能を得るためには、データベース・エンジンをどのように調整すれ +ば良いですか? -確かにインデックスは問い合わせの速度を増します。EXPLAINコマンドで PostgreSQL が -どのようにあなたの問い合わせを翻訳しているかを見ることができ、そして、どのイン -デックスが使われているかを見ることができます。 +確かにインデックスは問い合わせの速度を増します。EXPLAINコマンドで PostgreSQL +がどのようにあなたの問い合わせを翻訳しているかを見ることができ、そして、どの +インデックスが使われているかを見ることができます。 -もし INSERT を多用している場合は、COPY コマンドを使って大きなバッチ処理でそれを -行なうことを検討して下さい。これは、INSERT を別々に行なうよりもっと高速です。次 -に、BEGIN WORK/COMMIT のトランザクション・ブロックの中に無い文は、それら自身が -それぞれのトランザクションに入っていると見なされます。いくつかの文を一つのトラ -ンザクション・ブロックの中で行なうことを考えて下さい。これによりトランザクショ -ンのオーバーヘッドが減ります。また、大きなデータの変更を行なう際はインデックス -を一度外して、作り直すことを考えてみて下さい。 +もし INSERT を多用している場合は、COPY コマンドを使って大きなバッチ処理でそ +れを行なうことを検討して下さい。これは、INSERT を別々に行なうよりもっと高速 +です。次に、BEGIN WORK/COMMIT のトランザクション・ブロックの中に無い文は、そ +れら自身がそれぞれのトランザクションに入っていると見なされます。いくつかの文 +を一つのトランザクション・ブロックの中で行なうことを考えて下さい。これにより +トランザクションのオーバーヘッドが減ります。また、大きなデータの変更を行なう +際はインデックスを一度外して、作り直すことを考えてみて下さい。 -チューニングのオプションがいくつかあります。postmaster を -o -F オプションで起 -動することによって、fsync() を無効にすることができます。これによって、各トラン -ザクション毎に fsync() でディスクを更新するのを止めさせます。 +チューニングのオプションがいくつかあります。postmaster を -o -F オプションで +起動することによって、fsync() を無効にすることができます。これによって、各ト +ランザクション毎に fsync() でディスクを更新するのを止めさせます。 -postmaster -B オプションを使ってバックエンド・プロセスにより使われる共有メモリ -ー・バッファを大きくすることもできます。もし、このパラメータを高くしすぎると、 -カーネルの共有メモリー空間の制限値を越えてしまっうために postmaster が走らなく -なるでしょう。既定値では、それぞれのバッファの大きさは 8K で、バッファ数は 64 -です。 +postmaster -B オプションを使ってバックエンド・プロセスにより使われる共有メモ +リー・バッファを大きくすることもできます。もし、このパラメータを高くしすぎる +と、カーネルの共有メモリー空間の制限値を越えてしまっうために postmaster が走 +らなくなるでしょう。既定値では、それぞれのバッファの大きさは 8K で、バッファ +数は 64 です。 -バックエンドを -S オプションを使って、それぞれのバックエンド・プロセスが一時的 -な並べ替えによって使うメモリーの最大サイズを増やすこともできます。その -S の値 -はキロバイト単位で、既定値は 512 (すなわち、512K)です。 +バックエンドを -S オプションを使って、それぞれのバックエンド・プロセスが一時 +的な並べ替えによって使うメモリーの最大サイズを増やすこともできます。 その -S +の値はキロバイト単位で、既定値は 512 (すなわち、512K)です。 -また、CLUSTER コマンドを使って、テーブルのデータをインデックスに合わせるために -グループ化することもできます。詳しくは、オンラインマニュアルで CLUSTER を見て下 -さい。 +また、CLUSTER コマンドを使って、テーブルのデータをインデックスに合わせるため +にグループ化することもできます。詳しくは、オンラインマニュアルで CLUSTER を +見て下さい。 3.8) どのようなデバグ機能が使えますか? -PostgreSQL は、デバグのために意味のある、状態情報を報告するいくつかの機能を持ち -ます。 +PostgreSQL は、デバグのために意味のある、状態情報を報告するいくつかの機能を +持ちます。 -まず、--enable-cassert オプションで configure を走らせます。そうしてコンパイル -することにより、沢山の assert() が、バックエンドの進捗状況を監視し、何か予期せ -ぬことが起きるとプログラムを停止するようになります。 +まず、--enable-cassert オプションで configure を走らせます。そうしてコンパイ +ルすることにより、沢山の assert() が、バックエンドの進捗状況を監視し、何か予 +期せぬことが起きるとプログラムを停止するようになります。 + +postmaster と postgres の両方でいくつかのデバグ・オプションの利用ができま +す。まず、次のように postmaster を起動するときはいつでも、標準出力とエラー出 +力をログ・ファイルに送るようにしてあることを確かめて下さい。 -postmaster と postgres の両方でいくつかのデバグ・オプションの利用ができます。ま -ず、次のように postmaster を起動するときはいつでも、標準出力とエラー出力をログ -・ファイルに送るようにしてあることを確かめて下さい。 cd /usr/local/pgsql ./bin/postmaster >server.log 2>&1 & -これにより PostgreSQL の最上部のディレクトリに server.log ファイルが置かれます -。このファイルはサーバーが遭遇した問題やエラーについて有用な情報を含みます。 -Postmaster は更に詳細な情報を報告するための -d オプションを持ちます。その -d オ -プションは、デバグ・レベルを指定します。高いデバグ・レベルでは、大きなログファ -イルを生成することに注意しなくてはなりません。 +これにより PostgreSQL の最上部のディレクトリに server.log ファイルが置かれま +す。このファイルはサーバーが遭遇した問題やエラーについて有用な情報を含みま +す。Postmaster は更に詳細な情報を報告するための -d オプションを持ちます。そ +の -d オプションは、デバグ・レベルを指定します。高いデバグ・レベルでは、大き +なログファイルを生成することに注意しなくてはなりません。 -もし、postmasterが走っていなければ、postgresバックエンドをコマンド行から走らせ -ることができ、直接SQL文をタイプすることができます。このやりかたは、デバグ目的の -ときだけお奨めします。セミコロンではなく、改行が問い合わせの終りになることに注 -意してください。もし、デバグシンボルを入れてコンパイルしていれば、デバッガを使 -って何が起きているかを見ることができます。postmaster からバックエンドを開始した -わけではないので、独立な環境で走っているのではなくロック/バックエンドとの対話 -の問題が重複することはありません。 +もし、postmasterが走っていなければ、postgresバックエンドをコマンド行から走ら +せることができ、直接SQL文をタイプすることができます。このやりかたは、デバグ +目的のときだけお奨めします。セミコロンではなく、改行が問い合わせの終りになる +ことに注意してください。もし、デバグシンボルを入れてコンパイルしていれば、デ +バッガを使って何が起きているかを見ることができます。postmaster からバックエ +ンドを開始したわけではないので、独立な環境で走っているのではなくロック/バッ +クエンドとの対話の問題が重複することはありません。 -もし、postmasterが走っていれば、あるウィンドウでpsqlを開始すると、psql で使われ -る postgresプロセスのPIDが見つかります。デバッガを使ってpostgresのPIDにアタッチ -(attach)します。デバッガの中からブレーク・ポイントをセットし、psqlから問い合わ -せを発行します。デバグのためにpostgresを始動する場合は、PGOPTIONS="-W n" を設定 -でき、それから、psql を開始します。これにより、n 秒開始を遅らせるはずなので、デ -バッガでアタッチして始動を順を追って見ることができます。 +もし、postmasterが走っていれば、あるウィンドウでpsqlを開始すると、psql で使 +われる postgresプロセスのPIDが見つかります。デバッガを使ってpostgresのPIDに +アタッチ(attach)します。デバッガの中からブレーク・ポイントをセットし、psqlか +ら問い合わせを発行します。デバグのためにpostgresを始動する場合は、 +PGOPTIONS="-W n" を設定でき、それから、psql を開始します。これにより、n 秒開 +始を遅らせるはずなので、デバッガでアタッチして始動を順を追って見ることができ +ます。 -postgreSQL プログラムには、デバグと性能測定にとても役に立つ -sや -Aや -t 等のオ -プションがあります。 +postgreSQL プログラムには、デバグと性能測定にとても役に立つ -sや -Aや -t 等 +のオプションがあります。 -何という関数がどのくらい実行時間を食っているかを見るために、プロファイリング( -プロフィール付き)でコンパイルすることも可能です。そのバックエンドのプロフィー -ル・ファイルは pgsql/data/base/dbname ディレクトリに格納されるでしょう。クライ -アントのプロフィールはクライアントの現行ディレクトリに置かれるでしょう。 +何という関数がどのくらい実行時間を食っているかを見るために、プロファイリング +(プロフィール付き)でコンパイルすることも可能です。そのバックエンドのプロフ +ィール・ファイルは pgsql/data/base/dbname ディレクトリに格納されるでしょう。 +クライアントのプロフィールはクライアントの現行ディレクトリに置かれるでしょ +う。 3.9) 接続しようとするときに 'Sorry, too many clients' が出ます。なぜですか? -postmasterが同時始動できるバックエンドプロセスに対する制限数を増やす必要があり -ます。 +postmasterが同時始動できるバックエンドプロセスに対する制限数を増やす必要があ +ります。 PostgreSQL 6.5以降では、既定の最大プロセスは32プロセスです。適切な-Nの値で -postmasterを再起動することにより増加させることができます。既定の構成では-Nは最 -大1024まで設定できます。もし、もっと必要であればinclude/config.hの中の +postmasterを再起動することにより増加させることができます。既定の構成では-Nは +最大1024まで設定できます。もし、もっと必要であればinclude/config.hの中の MAXBACKENDSを増加させ、再構築します。もし、望むならconfigureの --with-maxbackends切替を使って、-Nの既定値を構成時に設定できます。 -もし、-N を 32よりも大きくするのであれば、-Bも既定の64より大きい値に増加させな -くてはならないし、-B は少なくとも -N の2倍はなくてはならず、おそらく最高性能を -望むならばそれより大きい値が必要なはずです。バックエンドプロセスをたくさんにす -ると、いろいろなUnixカーネル構成パラメータも増やすことが必要になるかもしれませ -ん。共有メモリー・ブロックの最大値(SHMMAX)、セマフォの最大数(SEMMNSとSEMMNI)、 -プロセスの最大数(NPROC)、ユーザ毎の最大プロセス数(MAXUPRC)、開くファイルの最大 -数(NFILEとNINODE も確認事項に含まれます。 PostgreSQLに許されるバックエンドのプ -ロセス数が制限されているのは、システムのリソースを使い果してしまうことを避ける -ためです。 +もし、-N を 32よりも大きくするのであれば、-Bも既定の64より大きい値に増加させ +なくてはならないし、-B は少なくとも -N の2倍はなくてはならず、おそらく最高性 +能を望むならばそれより大きい値が必要なはずです。バックエンドプロセスをたくさ +んにすると、いろいろなUnixカーネル構成パラメータも増やすことが必要になるかも +しれません。 共有メモリー・ブロックの最大値(SHMMAX)、 セマフォの最大数 +(SEMMNSとSEMMNI)、 プロセスの最大数(NPROC)、 ユーザ毎の最大プロセス数 +(MAXUPRC)、 開くファイルの最大数(NFILEとNINODE も確認事項に含まれます。 +PostgreSQLに許されるバックエンドのプロセス数が制限されているのは、 システム +のリソースを使い果してしまうことを避けるためです。 -6.5より前のバージョンのPostgreSQLではバックエンドの最大数は64でしたが、変更する -には、include/storage/sinvaladt.hの中のMaxBackendId定数を修正した後に再構築が必 -要でした。 +6.5より前のバージョンのPostgreSQLではバックエンドの最大数は64でしたが、変更 +するには、include/storage/sinvaladt.hの中のMaxBackendId定数を修正した後に再 +構築が必要でした。 -3.10) 自分のデータベース・ディレクトリにある pg_sorttemp.XXXファイルは何ですか -? +3.10) 自分のデータベース・ディレクトリにある pg_sorttemp.XXXファイルは何です +か? 問い合わせ実行モジュールによって生成された一時的なファイルです。例えば、もし -ORDER BY 句を満たすためにバックエンドの -S パラメータで許可した値よりも大きなス -ペースがソートの際に必要だとすると、溢れたデータを保持するために一時的なファイ -ルがいくつか生成されます。 +ORDER BY 句を満たすためにバックエンドの -S パラメータで許可した値よりも大き +なスペースがソートの際に必要だとすると、溢れたデータを保持するために一時的な +ファイルがいくつか生成されます。 + +一時的なファイルは自動的に消し去られるはずですが、もし、ソートの途中でバック +エンドがクラッシュしてしまうとそうはなりません。そのときバックエンドがひとつ +も走ってなければ、pg_tempNNN.NNファイルを消しても大丈夫です。 -一時的なファイルは自動的に消し去られるはずですが、もし、ソートの途中でバックエ -ンドが潰れてしまうとそうなりません。もし、そのときバックエンドがひとつも走って -なければ、pg_tempNNN.NNファイルを消しても安全です。 [訳注: - SYSLOGD 経由でログを出力するには、まず、configure を --enable-syslog + SYSLOGD 経由でログを出力するには、まず、configure を --enable-syslog 付きで走らせた後、コンパイルとインストールを行ないます。 次に、syslog.conf に local0.* の 出力先を指定し(環境変数で変更可能)、 syslogd に HUP シグナルを送って初期化しておきます。そして、 - $PGDATA/pg_options に syslog=2 を加えて、 postmaster を -S - オプション付きにてサーバモードで起動します。(バージョン 7.1 からは + $PGDATA/pg_options に syslog=2 を加えて、 postmaster を -S + オプション付きにてサーバモードで起動します。(バージョン 7.1 からは pg_options は postgresql.conf になっています。) ] + ------------------------------------------------------------------------ -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - 操作上の質問 + 操作上の質問 4.1) なぜ、システムはカンマや小数点や日付フォーマットで混乱するのですか? -ロケールの設定を確かめて下さい。PostgreSQL は postmaster プロセスを走らせたユー -ザーのロケールの設定を使います。postgres とpsql には SET コマンドがあり、データ -書式を制御できます。これらをあなたの操作環境に合わせて設定して下さい。 +ロケールの設定を確かめて下さい。PostgreSQL は postmaster プロセスを走らせた +ユーザーのロケールの設定を使います。postgres とpsql には SET コマンドがあ +り、データ書式を制御できます。これらをあなたの操作環境に合わせて設定して下さ +い。 -4.2) バイナリ・カーソルと通常のカーソルとの厳密な違いは何ですか? +4.2) バイナリ・カーソルと通常カーソルとの厳密な違いは何ですか? 詳述は、オンラインマニュアルで DECLARE を見て下さい。 -4.3) 問い合わせの最初の数行のみを SELECT するにはどうしますか? +4.3) 最初の数行のみを SELECT するにはどうしますか? -オンラインマニュアルでFETCHを見てください。あるいは、SELECT ... LIMIT....を使っ -てみて下さい。 +オンラインマニュアルでFETCHを見てください。あるいは、SELECT ... LIMIT....を +使ってみて下さい。 -たとえ、欲しいのは最初の数行だけでも、すべての問い合わせを評価しなくてはならな -いかもしれません。ORDER BY を持った問い合わせを考えてみて下さい。もし、ORDER BY -に合ったインデックスがあるとすると PostgreSQLは要求された最初の数行だけで評価で -きるかもしれませんが、でなれば、PostgreSQL は意図した行が生成されるまですべての -行を評価しなければならないかもしれません。 +たとえ、欲しいのは最初の数行だけでも、すべての問い合わせを評価しなくてはなら +ないかもしれません。ORDER BY を持った問い合わせを考えてみて下さい。 もし、 +ORDER BYに合ったインデックスがあるとすると PostgreSQLは要求された最初の数行 +だけで評価できるかもしれませんが、でなれば、PostgreSQL は意図した行が生成さ +れるまですべての行を評価しなければならないかもしれません。 4.4) テーブルやその他の情報のリストを psql で見るにはどうしますか? -psqlのソースコードが書かれた pgsql/src/bin/psql/describe.c ファイルを読むことが -できます。そこには、psqlのバックスラッシュコマンドによる出力のためのSQLコマンド -が含まれています。 psql に -E オプションをつけて起動すれば、与えたコマンドを実 -行するための問い合わせが出力されます。 +psqlのソースコードとして書かれた pgsql/src/bin/psql/describe.c ファイルを読 +むことがその答えです。 そこには、psqlのバックスラッシュコマンドによる出力の +ためのSQLコマンドが含まれています。 psql に -E オプションをつけて起動すれ +ば、与えたコマンドを実行するための問い合わせが出力されます。 -4.5) テーブルからの列の削除はどのようにしますか? +4.5) テーブルから列の削除はどのようにしますか? ALTER TABLE DROP COLUMN はサポートしていませんが、その代わりにこうします: + SELECT ... -- 削除したい列以外の列をすべて選択します。 INTO TABLE new_table FROM old_table; DROP TABLE old_table; ALTER TABLE new_table RENAME TO old_table; + [訳注:列の追加は ALTER TABLE ADD COLUMN で行えます。] 4.6) 行、テーブル、データベースの最大サイズは? 制限は以下のとおりです。 + データベースの最大サイズ? 制限無し (60GB のデータベースも存在します) テーブルの最大サイズ? 16TB 行の最大サイズ? 7.1以降で制限無し @@ -829,25 +805,27 @@ ALTER TABLE DROP COLUMN テーブル内での最大カラム数? カラムの型により250-1600 テーブル内での最大インデクス数? 制限無し -もちろん、これらは実際は無制限ではなく、ディスク容量とメモリーやスワップスペー -スの大きさにより制限されます。性能はこれらの値がことのほか大きな時に煽りを受け -ます。 +もちろん、これらは実際は無制限ではなく、ディスク容量とメモリーやスワップスペ +ースの大きさにより制限されます。性能はこれらの値がことのほか大きな時に煽りを +受けます。 -最大テーブルサイズの16TBはオペレーティングシステムのラージ・ファイルサポートは -必要としません。ラージ・テーブルは複数の1GBのファイルのように保存されます。 +最大テーブルサイズの16TBはオペレーティングシステムによる巨大ファイルのサポー +トは必要としません。巨大なテーブルは複数の1GBのファイルに分けて保存されます +ので、ファイルシステムの制限は重要ではありません。 -デフォルトのブロックサイズを32kにすると最大テーブルサイズと最大カラム数とが増加 -します。 +デフォルトのブロックサイズを32kにすると最大テーブルサイズと最大カラム数とが +増加します。 -4.7) 一般的なテキストファイルからデータを保存するには、データベースのディスク容 -量はどのくらい必要です? +4.7) 一般的なテキストファイルからデータを保存するには、データベースのディス +ク容量はどのくらい必要です? -PostgreSQL のデータベースに保存するには、普通のファイルの約6.5倍のディスク容量 -を必要とします。 +PostgreSQL のデータベースに保存するには、普通のファイルの約6.5倍のディスク容 +量を必要とします。 + +各行に二つずつ整数を持つ 300,000行のファイルを考えてみましょう。ただのファイ +ルでは 2.4MB です。このデータを含む PostgreSQL データベースファイルの大きさ +は次のように約14MBと見積もることができます: -各行に二つずつ整数を持つ 300,000行のファイルを考えてみましょう。ただのファイル -では 2.4MB です。このデータを含む PostgreSQL データベースファイルの大きさは次の -ように約14MBと見積もることができます: 36 bytes: 各行のヘッダ(概算) + 8 bytes: 各4バイトの二つの整数(int)フィールド + 4 bytes: ページ上のタップルへのポインタ @@ -863,81 +841,80 @@ PostgreSQL 300000 data rows -------------------- = 1755 database pages 171 rows per page - + 1755 database pages * 8192 bytes per page = 14,376,960 bytes (14MB) -インデックスは、これほどのオーバヘッドは要求しませんが、インデックス付けされる -データを含む以上、それなりに大きくなります。 +インデックスは、これほどのオーバヘッドは要求しませんが、インデックス付けされ +るデータを含む以上、それなりに大きくなります。 -4.8) データベース内に定義されたテーブルやインデックスをどのように見つけ出します -か? +4.8) データベース内に定義されたテーブルやインデックスをどのようにして見つけ +出しますか? -psql にはいろいろなバックスラッシュ・コマンドがあり、こうした情報を表示します。 -バックスラッシュ・コマンドの種類を見るには \? を使って下さい。 +psql にはいろいろなバックスラッシュ・コマンドがあり、こうした情報を表示しま +す。バックスラッシュ・コマンドの種類を見るには \? を使って下さい。 -また、pgsql/src/tutorial/syscat.source ファイルを走らせてみて下さい。それは、沢 -山の SELECT 文により必要な情報をデータベースのシステム・テーブルから取り出して -例示してくれます。 +また、pgsql/src/tutorial/syscat.source ファイルを走らせてみて下さい。それ +は、沢山の SELECT 文により必要な情報をデータベースのシステム・テーブルから取 +り出して例示してくれます。 -4.9) 問い合わせが遅いうえ、インデックスを使っている様子がありません。なぜですか -? +4.9) 問い合わせが遅いうえ、インデックスを使っている様子がありません。なぜで +すか? PostgreSQL は統計情報を自動的には保守しません。統計情報を更新するためには、 -VACUUM を走らせなくてはなりません。統計情報が更新された後は、オブティマイザがテ -ーブルに何行あるかを知って、インデックスを使うべきかの決定をより良く下します。 -オブティマイザはテーブルが小さくて連続スキャンの方が速いであろう場合はインデッ -クスを使わないことにご注意下さい。 +VACUUM を走らせなくてはなりません。統計情報が更新された後は、オブティマイザ +がテーブルに何行あるかを知って、インデックスを使うべきかの決定をより良く下し +ます。オブティマイザはテーブルが小さくて連続スキャンの方が速いであろう場合は +インデックスを使わないことにご注意下さい。 -列特定の最適化統計のためにVACUUM ANALYZEを使います。VACUUM ANALYZEは複雑な複合 -結合(multi-join)問い合わせのために大切ですので、オブティマイザはそれぞれのテー -ブルから返される行の数を見積ることができ、特定の結合順序を選びます。バックエン -ドはそれ自身では列の統計を保持しないので、定期的にそれらを集めるためには VACUUM -ANALYZE を走らせなくてはなりません。 +列特定の最適化統計のためにVACUUM ANALYZEを使います。VACUUM ANALYZEは複雑な複 +合結合(multi-join)問い合わせのために大切ですので、オブティマイザはそれぞれの +テーブルから返される行の数を見積ることができ、特定の結合順序を選びます。バッ +クエンドはそれ自身では列の統計を保持しないので、定期的にそれらを集めるために +は VACUUM ANALYZE を走らせなくてはなりません。 -インデックスは ORDER BY 操作のためには普通は使われません。すなわち、順次スキャ -ンに続く明示的ソートは、ディスクアクセスがより少なくて済むので、巨大なテーブル -の全件をインデックススキャンするよりも高速です。 +普通、インデックスは ORDER BY や結合の操作のためには使われません。ランダムな +ディスクアクセスはとても遅いので、順次スキャンに続く明示的ソートは、巨大なテ +ーブルの全件をインデックススキャンするよりも高速です。 -LIKE あるいは ~ のようなワイルドカード演算子(wild-card operators)を使うとき、検 -索の開始が文字列の始めの部分に固定されているときにのみ、インデックスが使われま -す。そういうわけで、インデックスを使うためには、LIKE 検索では%で始めないように -して、また、~(正規表現検索)は^ で始めるようにするべきです。 [訳注:強制的にイン -デックスを使うには SET enable_seqscan = off を実行します] +LIKE あるいは ~ のようなワイルドカード演算子(wild-card operators)を使うと +き、検索の開始が文字列の始めの部分に固定されているときにのみ、インデックスが +使われます。 そういうわけで、インデックスを使うためには、LIKE 検索では%で始 +めないようにして、また、~(正規表現検索)は^ で始めるようにするべきです。 [訳 +注:強制的にインデックスを使うには SET enable_seqscan = off を実行します] -4.10) 問い合わせオブティマイザがどのように問い合わせを評価するのかを見るにはど -うしますか? +4.10) 問い合わせオブティマイザがどのように問い合わせを評価するのかを見るには +どうしますか? オンラインマニュアルで EXPLAIN を見て下さい。 4.11) R-tree インデックスとは何ですか? -R-tree インデックスは空間的なデータにインデックスを付けるために使われます。ハッ -シュインデックスでは範囲の検索ができません。また、B-tree インデックスでは、1次 -元でしか範囲の検索ができません。R-tree インデックスであれば多次元のデータを扱え -ます。たとえば、もし R-tree インデックスを point 型の属性に付けることができると -するとシステムは、「長方形に囲まれた点をすべて選択する」というような問い合わせ -に、より効率良く答えられます。 +R-tree インデックスは空間的なデータにインデックスを付けるために使われます。 +ハッシュインデックスでは範囲の検索ができません。また、B-tree インデックスで +は、1次元でしか範囲の検索ができません。R-tree インデックスであれば多次元の +データを扱えます。たとえば、もし R-tree インデックスを point 型の属性に付け +ることができるとするとシステムは、「長方形に囲まれた点をすべて選択する」とい +うような問い合わせに、より効率良く答えられます。 R-Tree の設計の原典となる権威ある論文は: -Guttman, A. "R-Trees: A Dynamic Index Structure for Spatial Searching." Proc of -the 1984 ACM SIGMOD Int'l Conf on Mgmt of Data, 45-57. +Guttman, A. "R-Trees: A Dynamic Index Structure for Spatial Searching." Proc +of the 1984 ACM SIGMOD Int'l Conf on Mgmt of Data, 45-57. -この論文は、Stonebraker 教授の "Readings in Database Systems" でも取り上げられ -ています。 +この論文は、Stonebraker 教授の "Readings in Database Systems" でも取り上げら +れています。 [訳注: 奈良先端大の石川佳治さんよりR-Tree関係の文献を紹介して頂きました。 - 日本語 Postgres ML のアーカイブから "Subject: [postgres95 801] spatial data structures" + 日本語 Postgres ML のアーカイブから "Subject: [postgres95 801] spatial data structures" http://www.sra.co.jp/people/t-ishii/PostgreSQL/mhonarc/pgsql-jp/1996Oct/msg00007.html をご覧下さい。 ] - -組込みの R-Tree でポリゴンやボックスを操作できます。理論的にはR-Tree はもっと高 -い次元を操作するようにも拡張できます。実質的には、R-Tree の拡張にはちょっとした -作業が必要でして、現在、我々はそれをどのようにするかについての文書を持っていま -せん。 +組込みの R-Tree でポリゴンやボックスを操作できます。理論的にはR-Tree はもっ +と高い次元を操作するようにも拡張できます。実質的には、R-Tree の拡張にはちょ +っとした作業が必要でして、現在、我々はそれをどのようにするかについての文書を +持っていません。 [訳注: インターウィズの片岡さんが多次元幾何オブジェクトへの拡張作業中です。詳しくは、 @@ -945,23 +922,37 @@ the 1984 ACM SIGMOD Int'l Conf on Mgmt of Data, 45-57. をご覧ください。 ] - 4.12) 遺伝的問い合わせ最適化とは何ですか? -GEQO モジュールは、沢山のテーブルを結合するときに、遺伝的アルゴリズム(GA)で問合 -わせを高速化します。これにより、しらみつぶしに探索を行なわなくても、大きな結合 -(join queries)を扱うことができるようになります。 +GEQO モジュールは、沢山のテーブルを結合するときに、遺伝的アルゴリズム(GA)で +問合わせを高速化します。これにより、しらみつぶしに探索を行なわなくても、大き +な結合(join queries)を扱うことができるようになります。 -4.13) 正規表現での検索や大文字と小文字とを区別しない正規表現検索はどのように実 -現しますか? +4.13) 正規表現での検索や大文字と小文字とを区別しない正規表現検索はどのように +実現しますか?大文字と小文字とを区別しない検索のためのインデックスはどのよう +に使いますか? ~演算子は正規表現照合を行ない、~* は大文字と小文字を区別しない -(case-insensitive)正規表現照合を行います。 PostgreSQL 7.1 以降では、大文字と小 -文字を区別しない LIKE 演算子を ILIKE といいます。 +(case-insensitive)正規表現照合を行います。 PostgreSQL 7.1 以降では、大文字と +小文字を区別しない LIKE 演算子を ILIKE といいます。 + +大文字と小文字を区別しない等値比較次のように表現できる: + + SELECT * + FROM tab + WHERE lower(col) = 'abc' + + +標準インデックスでは使われず、しかしながら、もし関数インデックスを 作ったな +らそれが使われるでしょう。 + + CREATE INDEX tabindex on tab (lower(col)); + + WHERE lower(textfield) LIKE lower(pattern) -4.14) 問い合わせの中で、フィールドが NULL であることを検出するにはどうしますか -? +4.14) 問い合わせの中で、フィールドが NULL であることを検出するにはどうします +か? IS NULLのカラムを IS NOT NULL で試してみて下さい。 @@ -975,186 +966,208 @@ VARCHAR(#) varchar 長 TEXT text 長さの制限は最大行長による BYTEA bytea 可変長のバイト配列 -内部名にお目にかかるのは、システム・カタログを調べるときや、エラーメッセージを -受け取るときです。 +内部名にお目にかかるのは、システム・カタログを調べるときや、エラーメッセージ +を受け取るときです。 -上記の型のうち後の4つの型は "varlena" 型です(すなわち、ディスクの最初の4バイ -トがデータ長で、それの後に実際のデータが続きます)。このように実際の空間は宣言さ -れた大きさよりも少し大きくなります。しかし、これらのデータ型はTOASTにより圧縮さ -れたり複数行に渡って保存されたりして、ディスク上の空間は思ったより小さくなりま -す。 +上記の型のうち後の4つの型は "varlena" 型です(すなわち、ディスクの最初の4バ +イトがデータ長で、それの後に実際のデータが続きます)。このように実際の空間は +宣言された大きさよりも少し大きくなります。しかし、これらのデータ型はTOASTに +より圧縮されたり複数行に渡って保存されたりして、ディスク上の空間は思ったより +小さくなります。 4.16.1) 通番(serial)/自動増分フィールドはどのようにつくりますか? -PostgreSQL は SERIAL データ型をサポートします。列上に通番とインデックスを自動作 -成します。たとえば、 - CREATE TABLE person ( - id SERIAL, - name TEXT +PostgreSQL は SERIAL データ型をサポートします。列上に通番とインデックスを自 +動作成します。たとえば、 + + CREATE TABLE person ( + id SERIAL, + name TEXT ); + は自動的に次のように翻訳されます: + CREATE SEQUENCE person_id_seq; - CREATE TABLE person ( + CREATE TABLE person ( id INT4 NOT NULL DEFAULT nextval('person_id_seq'), - name TEXT + name TEXT ); CREATE UNIQUE INDEX person_id_key ON person ( id ); -通番についてのもっと詳しい情報は、オンラインマニュアルで create_sequence をご覧 -下さい。 -また、各行のOIDフィールドを一意値として使うこともできます。しかしながら、もしも -データベースをダンプしてりロードする必要がある場合は、OIDを温存するために -pg_dump で -oオプションを使うか、または、COPY WITH OIDSオプションを使う必要があ -ります。 Bruce Momjian の(http://www.PostgreSQL.org/docs/aw_pgsql_book)の -Numbering Rowsの章にありあます。 +通番についてのもっと詳しい情報は、オンラインマニュアルで create_sequence を +ご覧下さい。 -4.16.2) SERIALインサートの値はどうすれば得られますか? +また、各行のOIDフィールドを一意値として使うこともできます。しかしながら、も +しもデータベースをダンプしてりロードする必要がある場合は、OIDを温存するため +にpg_dump で -oオプションを使うか、または、COPY WITH OIDSオプションを使う必 +要があります。 Bruce Momjian の +(http://www.PostgreSQL.org/docs/aw_pgsql_book)の Numbering Rowsの章にありあ +ます。 + +4.16.2) SERIALデータ型に挿入される値は、どうすれば得られますか? + +ひとつの方法は、nextval() 関数を使ってその値を挿入する前(before)に SEQUENCE +オブジェクトから次の SERIAL 値を取り出し、それから実際に挿入をすることです。 +4.16.1 の例で使ったテーブルを使うとすると、次のようになります。 -ひとつの方法は、nextval() 関数で挿入する前に(before) SEQUENCEオブジェクトから次 -のSERIAL値を取り出し、それから実際に挿入をすることでしょう。 4.16.1の例で使った -テーブルを使うとすると、次のようになるでしょう。 $newSerialID = nextval('person_id_seq'); INSERT INTO person (id, name) VALUES ($newSerialID, 'Blaise Pascal'); -そうして、$newSerialID に保存した新しい値を他の問い合わせに(たとえば、person テ -ーブルに対する外部鍵(foreign key)のように)使うとよいでしょう。自動的に作られた -SEQUENCEオブジェクトの名前は、__seq のようになり、このうち -、table と serialcolumn はそれぞれテーブルの名前とSERIAL列の名前です。 + +そうして、$newSerialID に保存した新しい値を他の問い合わせに(たとえば、person +テーブルに対する外部キー(foreign key)のように)使うとよいでしょう。自動的に作 +られたSEQUENCEオブジェクトの名前は、
__seq のようにな +り、このうち、table と serialcolumn はそれぞれテーブルの名前とSERIAL列の名前 +です。 あるいは、与えられたSERIAL値を、それが既定値として挿入された後で(after)、 currval() 関数を使って取り出すこともできます。たとえば、 + INSERT INTO person (name) VALUES ('Blaise Pascal'); $newID = currval('person_id_seq'); -最後に、INSERT文から返るOIDを使って、既定値をみつけることもできますが、しかし、 -これは最も移植性の低いやり方でしょう。PerlのDBIで Edmund Mergl の DBD::Pg モジ -ュールを使えば、$sth->execute() の後に $sth->{pg_oid_status} を経由してその OID -値を使えるようにすることはできます。 -4.16.3) 他のユーザとの競合状態を避けるためには、currval() と nextval() は使わな -いほうがよいのでしょうか? +最後に、INSERT文から返るOIDを使って、既定値をみつけることもできますが、しか +し、これは最も移植性の低いやり方でしょう。PerlのDBIで Edmund Mergl の作った +DBD::Pg モジュールを使えば、$sth->execute() の後に $sth->{pg_oid_status} を +経由してその OID 値を使えるようにすることはできます。 -ありません。バックエンドで処理されています。 +4.16.3) 他のユーザとの競合状態を避けるためには、currval() と nextval() は使 +わないほうがよいのでしょうか? + +バックエンドが上手に処理するので、競合状態になることは有りません。 4.17) OID とは何ですか? TID とは何ですか? -OID とは一意の行 ID に対する PostgreSQL の答えです。PostgreSQL の中でつくられる -すべての行は一意の OID を得ます。initdb で(backend/access/transam.h から)発生さ -れる OID はすべて 16384より小さな値です。initdb 後のすべての OID (ユーザ作成)は -それ以上の値になります。既定では、これらすべての OID はテーブル内やデータベース -内に留まらず、PostgreSQL のそのインストレーション全体内で一意であります。 +OID とは一意の行 ID に対する PostgreSQL の答えです。PostgreSQL の中でつくら +れるすべての行は一意の OID を得ます。initdb で発生される OID はすべて 16384 +(backend/access/transam.h から)より小さな値です。initdb 後のすべての OID (ユ +ーザ作成)はそれ以上の値になります。 既定では、これらすべての OIDは一つのデー +ブルやデータベース内に留まらず、PostgreSQL インストレーション全体の中で一意 +です。 -PostgreSQL はテーブル間の行を結びつけるために、そのシステムテーブル内に OID を -使います。この OID は特定のユーザの行を識別するためや結合の中で使われることがで -きます。OID の値を保存するためには OID 型を列に使うことを奨めます。より速くアク -セスするために OID フィールドにインデックスを作ることができます。 +PostgreSQL はテーブル間の行を結びつけるために、そのシステムテーブル内に OID +を使います。この OID は特定のユーザの行を識別するためや結合の中で使われるこ +とができます。OID の値を保存するためには OID 型を列に使うことを奨めます。よ +り速くアクセスするために OID フィールドにインデックスを作ることができます。 +OID は、全てのデータベースで使われる中央領域から、全ての新しい行に割り当てら +れます。OID を他の何かに変えたい、あるいは元の OID もテーブルと一緒にコピー +したいのなら、できなくはありません。 -OID は、全てのデータベースから使われる中央領域から、全ての新しい行に割り当てら -れます。OID を他の何かに変えたい、もしくは元の OID でテーブルをコピーしたいのな -ら、そうできない理由はありません。 - CREATE TABLE new_table(old_oid oid, mycol int); + CREATE TABLE new (old_oid oid, mycol int); SELECT old_oid, mycol INTO new FROM old; COPY new TO '/tmp/pgtable'; DELETE FROM new; COPY new WITH OIDS FROM '/tmp/pgtable'; +OID は、4バイトの整数として保存されているので、40億を越えると溢れてしまうで +しょう。誰もこれが起きたと報告してくる人はいませんでしたが、そうなる前にこの +制限を取り除くことを計画しています。 -OID は、4バイトの整数として保存されているので、40億を越えると溢れてしまうでしょ -う。誰もこれが起きたと報告してくる人はいませんでしたが、そうなる前にこの制限を -取り除くことを計画しています。 - -TID は特定の物理行をそのブロックとオフセット値で識別するために使われます。TID -は行が修正されたり再ロードされると変わります。それらの TID は、物理行を指すため -にインデックス記載で使われます。 +TID は特定の物理行をそのブロックとオフセット値で識別するために使われます。 +TID は行が修正されたり再ロードされると変わります。それらの TID は、物理行を +指すためにインデックス記載で使われます。 4.18) PostgreSQL で使われるいくつかの用語の意味は何ですか? -いくつかのソースコードや古い文書の中には、それぞの専門分野の中でもっと一般的に -使われる専門用語が使われています。 - - - ・ テーブル(table)、関係(relation)、クラス(class) - ・ 行(row)、レコード(record)、タップル(tuple) - ・ 列(column)、フィールド(field)、属性(attribute) - ・ 取得(retrieve)、選択(select) - ・ 置換(replace)、更新(update) - ・ 追加(append)、挿入(insert) - ・ OID, 連番(serial value) - ・ ポータル(portal), カーソル(cursor) - ・ 領域変数(range variable)、テーブル名(table name)、テーブル別名(table alias) +いくつかのソースコードや古い文書の中には、それぞの専門分野の中でもっと一般的 +に使われる専門用語が使われています。 -一般的なデータベース用語のリストは: http://www.comptechnews.com/~reaster/ -dbdesign.html で見つけられます。 + * テーブル(table)、関係(relation)、クラス(class) + * 行(row)、レコード(record)、タップル(tuple) + * 列(column)、フィールド(field)、属性(attribute) + * 取得(retrieve)、選択(select) + * 置換(replace)、更新(update) + * 追加(append)、挿入(insert) + * OID, 連番(serial value) + * ポータル(portal), カーソル(cursor) + * 領域変数(range variable)、テーブル名(table name)、テーブル別名(table + alias) -4.19) エラーメッセージ "ERROR: Memory exhausted in AllocSetAlloc()"が出るのはな -ぜですか? +一般的なデータベース用語のリストは: +http://www.comptechnews.com/~reaster/dbdesign.html で見つけられます。 + +4.19) エラーメッセージ "ERROR: Memory exhausted in AllocSetAlloc()"が出るの +はなぜですか? + +もし、7.1 よりも古いバージョンをお使いの場合は、アップデートによってこの問題 +を 解決できるでしょう。それと、システムの仮想メモリーを全て使い果たしてしま +っている可能性があるか、カーネルがあるリソースについてもつ制限値が低すぎる可 +能性があります。 postmaster を始動する前にこれを試してみて下さい: -システムの仮想メモリーを全て使い果たしてしまっている可能性があるか、あるいはカ -ーネルがあるリソースについて低い制限値を持っている可能性があります。 postmaster -を開始する前にこれを試してみて下さい: ulimit -d 262144 limit datasize 256m -シェルによって、どちらかひとつが成功するでしょうが、これはプロセスのデータセグ -メント制限をより高く設定し、たぶん問い合わせが完結するようになるでしょう。この -コマンドは現行のプロセスと、このコマンドを走らせた後に作られる全てのサブプロセ -スについて適用されます。バックエンドがとても多くのデータを返すためにSQL クライ -アントで問題が続いているのであれば、クライアントを開始する前にこれを試してみて -ください。 +シェルによって、どちらかひとつが成功するでしょうが、これはプロセスのデータセ +グメント制限をより高く設定し、たぶん問い合わせが完結するようになるでしょう。 +このコマンドは現行のプロセスと、このコマンドを走らせた後に作られる全てのサブ +プロセスについて適用されます。バックエンドがとても多くのデータを返すために +SQL クライアントで問題が続いているのであれば、クライアントを開始する前にこれ +を試してみてください。 4.20) どのバージョンの PostgreSQL を走らせているかを調べるにはどうしますか? psql から select version(); をタイプします。 -4.21) ラージ・オブジェクトの操作でinvalid large obj descriptor を受け取りました -。なぜでしょうか? +4.21) ラージ・オブジェクトの操作でinvalid large obj descriptor を受け取りま +した。なぜでしょうか? -ラージ・オブジェクト操作をするときは、前後にBEGIN WORKとCOMMITを付ける必要があ -ります。すなわち、lo_open ... lo_closeをはさみ込みます。 +ラージ・オブジェクト操作をするときは、前後にBEGIN WORKとCOMMITを付ける必要が +あります。すなわち、lo_open ... lo_closeをはさみ込みます。 -現在は、PostgreSQLのトランザクションのコミット時にラージ・オブジェクト・ハンド -ルを閉じることにより、lo_openコマンドが完了した直後に強制的にルールを実行します -。このため、最初にハンドルに対して何かをしようとすると、invalid large obj -descriptor(ラージオブジェクトの記述子が不正)となります。それで、もし、トランザ -クションを使うのを忘れると、(少なくともほとんどの時間)働いていたコードがエラ -ーメッセージを出すのです。 +現在は、PostgreSQLのトランザクションのコミット時にラージ・オブジェクト・ハン +ドルを閉じることにより、lo_openコマンドが完了した直後に強制的にルールを実行 +します。このため、最初にハンドルに対して何かをしようとすると、invalid large +obj descriptor(ラージオブジェクトの記述子が不正)となります。それで、もし、ト +ランザクションを使うのを忘れると、(少なくともほとんどの時間)働いていたコー +ドがエラーメッセージを出すのです。 -もし、ODBCのようなクライアントインターフェースをお使いなら、auto-commit offを設 -定する必要があるかもしれません。 +もし、ODBCのようなクライアントインターフェースをお使いなら、auto-commit off +を設定する必要があるかもしれません。 4.22) 現在の時刻がデフォルトとなるような列はどのようにつくりますか? now()を使います: + CREATE TABLE test (x int, modtime timestamp DEFAULT now() ); 4.23) なぜ、INを使う副問い合わせがとても遅いのですか? -現在、外部問い合わせの各行について副問い合わせの結果を順番にスキャンすることに -より、副問い合わせを外部問い合わせに結合しています。当面はINをEXISTSで置き換え -ることです: +現在、外部問い合わせの各行について副問い合わせの結果を順番にスキャンすること +により、副問い合わせを外部問い合わせに結合しています。当面はINをEXISTSで置き +換えることです: + SELECT * FROM tab WHERE col1 IN (SELECT col2 FROM TAB2) + を、置き換えて: + SELECT * FROM tab WHERE EXISTS (SELECT col2 FROM TAB2 WHERE col1 = col2) -とします。この制限は将来のリリースで直したいと思っています。 + +とします。 この制限は将来のリリースで直したいと思っています。 4.24) 外部結合(outer join)はどのように実現しますか? -PostgreSQL 7.1 以降ではSQL標準構文を使う外部結合(アウタージョイン)をサポートし -ます。ここに、例題が2つあります。 +PostgreSQL 7.1 以降ではSQL標準構文を使う外部結合(アウタージョイン)をサポート +します。ここに、例題が2つあります。 + SELECT * FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col); + あるいは + SELECT * FROM t1 LEFT OUTER JOIN t2 USING (col); -これらの象徴的な問い合わせでは t1.col を t2.col と結合して、t1 の結合されなかっ -た行(t2 と一致しなかった行)も返しています。RIGHT 結合は t2 の結合されなかった行 -を加えるでしょう。FULL 結合は、一致した行に t1 と t2 からは結合されなかった行を -返すでしょう。OUTER という言葉はオプションで LEFT, RIGHT, または FULL などの結 -合を仮定されています。以前のリリースでは外部結合(outer join)をUNION と NOT IN -を使ってシミュレートできます。たとえば、tab1 と tab2 を結合するときは、次の問い -合わせで二つのテーブルを外部結合します。 + +これらの象徴的な問い合わせでは t1.col を t2.col と結合して、t1 の結合されな +かった行(t2 と一致しなかった行)も返しています。RIGHT 結合は t2 の結合されな +かった行を加えるでしょう。FULL 結合は、一致した行に t1 と t2 からは結合され +なかった行を返すでしょう。OUTER という言葉はオプションで LEFT, RIGHT, または +FULL などの結合を仮定されています。 以前のリリースでは外部結合(outer join)を +UNION と NOT IN を使ってシミュレートできます。 たとえば、tab1 と tab2 を結合 +するときは、次の問い合わせで二つのテーブルを外部結合します。 + SELECT tab1.col1, tab2.col2 FROM tab1, tab2 WHERE tab1.col1 = tab2.col1 @@ -1164,33 +1177,68 @@ PostgreSQL 7.1 WHERE tab1.col1 NOT IN (SELECT tab2.col1 FROM tab2) ORDER BY col1 -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - PostgreSQLの拡張についての質問 + ------------------------------------------------------------------------ -5.1) 自分で書いたユーザ定義関数を psql の中で実行するとコア・ダンプしてしまうの -はなぜですか? + PostgreSQLの拡張についての質問 -問題は色々と考えられます。まず最初に、作成したユーザ定義関数を単独のテストプロ -グラムにして試してみて下さい。 +5.1) 自分で書いたユーザ定義関数を psql の中で実行するとコア・ダンプしてしま +うのはなぜですか? -5.2) PostgreSQL 用に書いた粋な新しい型や関数は、どうすれば寄贈できますか? +問題は色々と考えられますが、まず最初に、作成したユーザ定義関数を単独のテスト +プログラムにして試してみて下さい。 -皆さんの行なった拡張を、pgsql-hackers メーリング・リストに送ってください。そし -て、ゆくゆくはそうした拡張が contrib/ サブディレクトリの中に入ることになるでし -ょう。 +5.2) PostgreSQL 用に書いたちょっと素敵な新しい型や関数を提供してプロジェクト +に貢献したいのですが? + +皆さんの行なった拡張を、pgsql-hackers メーリング・リストに送ってください。そ +して、ゆくゆくはそうした拡張が contrib/ サブディレクトリの中に入ることになる +でしょう。 5.3) タプルを返す C言語の関数はどのように書きますか? -原理的には可能ですが、これには究極の妙技を要しますので、著者のまわりでは未だ誰 -もやったことがありません。 +原理的には可能ですが、これには究極の妙技を要しますので、著者のまわりでは未だ +誰もやったことがありません。 -5.4) ソース・ファイルを変更しました。再コンパイルしても変化が見られないのはなぜ -ですか? +5.4) ソース・ファイルを変更しました。再コンパイルしても変化が見られないのは +なぜですか? + +いくつかの Makefile がインクルード・ファイルに対して適切な依存関係を持ってい +ません。make clean をしてからもう一度 make を行なわなくてはなりません。も +し、GCC をお使いであれば configure の --enable-depend オプションを使って、コ +ンパイラに依存関係を自動的に調べさせることもできます。 + ------------------------------------------------------------------------ -いくつかの Makefile がインクルード・ファイルに対して適切な依存関係を持っていま -せん。make clean をしてからもう一度 make を行なわなくてはなりません。もし、GCC -をお使いであれば configure の --enable-depend オプションを使って、コンパイラに -依存関係を自動的に調べさせることもできます。 -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [訳注: + 日本語版の製作については以下の通りです。 + + 最終更新日: 2001年07月05日 + 翻訳者: 桑村 潤 (Jun Kuwamura ) + + このFAQの和訳の作成にあたり協力をしてくださった方々(敬称は略させていただきます): + + 田仲 稔(Minoru Tanaka ) + 石井 達夫(Tatsuo Ishii ) + 齊藤 知人(Tomohito Saitoh ) + 馬場 肇(Hajime Baba ) + 岡本 一幸(Kazuyuki Okamoto ) + 小菅 昭一(Shoichi Kosuge ) + 山下 義之(Yoshiyuki Yamashita ) + 境 真太郎(Sintaro Sakai ) + 生越 昌己(Masami Ogoshi ) + 石川 俊行(Toshiyuki Ishikawa ) + 本田 茂広(Shigehiro Honda ) + せせ じゅん(Jun Sese ) + 神谷 英孝(Hidetaka Kamiya ) + + をはじめ、ポストグレスに関する話題豊富な日本語ポストグレス・メーリングリスト、 + 和訳のきっかけを作ってくれた JF(Linux Japanese FAQ Mailing List)プロジェクト、その他、 + 直接あるいは間接的にかかわっているすべてのオープンソースコミュニティーの + 皆さんに感謝します。 + + 日本語版のこの文書は、以下からもたどれます。 + http://www.rccm.co.jp/~juk/pgsql/(FAQ和訳 PostgreSQL についてよくある質問) + http://www.linux.or.jp/JF/(PostgreSQL-FAQ.j) + http://www.sra.co.jp/people/t-ishii/PostgreSQL/doc-jp/ + + なお、この和訳に関するご意見は(juk@jp.postgresql.org)までお寄せ下さい。 ] diff --git a/doc/src/FAQ/FAQ_japanese.html b/doc/src/FAQ/FAQ_japanese.html index ddfb9051d1..6047af6761 100644 --- a/doc/src/FAQ/FAQ_japanese.html +++ b/doc/src/FAQ/FAQ_japanese.html @@ -5,9 +5,9 @@

-PostgreSQL(ポストグレス・キュー・エル)についてよくある質問(FAQ)

+PostgreSQL(ポストグレス・キュー・エル)についてよくある質問とその解答(FAQ)

-原文最終更新日: Mon Apr 9 15:27:47 EDT 2001 +原文最終更新日: Tue Jul 10 21:01:47 EDT 2001

現在の維持管理者: Bruce Momjian (pgman@candle.pha.pa.us)

@@ -24,48 +24,15 @@ HREF="mailto:pgman@candle.pha.pa.us">pgman@candle.pha.pa.us)

+(以下、訳者による注釈を [訳注: と ] とで囲んで記します。)
 [訳注:
-	(以下、訳者による注釈を [訳注: と ] とで囲んで記します。)
+	日本語版製作についてのメモは最後尾へ移動しました。
 
-	  http://www.PostgreSQL.org/ にアクセスすると http://postgresql.nucba.ac.jp/
-にリダイレクトされ、"Not Found" になってしまうことがあります。その場合は、
-		http://www.PostgreSQL.org/index.html
-	にアクセスしてみてください。
+	日本語版のこの文書は "User's Lounge" の "Collection of FAQs" の
+	"Japanese" という見出しのところにあります。
+	(http://www.PostgreSQL.org/docs/faq-japanese.html)
 
-
-  日本語版の製作については以下の通りです。
-
-  最終更新日:	2001年04月15日
-  翻訳者:	桑村 潤 (Jun Kuwamura <juk@jp.postgresql.org>)
-
-  このFAQの和訳の作成にあたり協力をしてくださった方々(敬称は略させていただきます):
-
-		田仲 稔(Minoru Tanaka <Tanaka.Minoru@keiken.co.jp>)
-		石井 達夫(Tatsuo Ishii <t-ishii@sra.co.jp>)
-		齊藤 知人(Tomohito Saitoh <tomos@elelab.nsc.co.jp>)
-		馬場  肇(Hajime Baba <baba@kusastro.kyoto-u.ac.jp>)
-		岡本 一幸(Kazuyuki Okamoto <kokamoto@itg.hitachi.co.jp>)
-		小菅 昭一(Shoichi Kosuge <s-kosuge@str.hitachi.co.jp>)
-		山下 義之(Yoshiyuki Yamashita <dica@eurus.dti.ne.jp>)
-		境 真太郎(Sintaro Sakai <s_sakai@mxn.mesh.ne.jp>)
-		生越 昌己(Masami Ogoshi <ogochan@zetabits.com>)
-		石川 俊行(Toshiyuki Ishikawa <tosiyuki@gol.com>)
-		本田 茂広(Shigehiro Honda <fwif0083@mb.infoweb.ne.jp>)
-		せせ じゅん(Jun Sese <sesejun@linet.gr.jp>)
-
-  をはじめ、ポストグレスに関する話題豊富な日本語ポストグレス・メーリングリスト、
-  和訳のきっかけを作ってくれた JF(Linux Japanese FAQ Mailing List)プロジェクト、その他、
-  直接あるいは間接的にかかわっているすべてのオープンソースコミュニティーの
-  皆さんに感謝します。
-
-  日本語版のこの文書はhttp://www.PostgreSQL.org/users-lounge/docs/faq-japanese.htmlにあるほか,
-  以下のサイトからもたどれます。
-	http://www.jp.postgresql.org/
-	http://www.rccm.co.jp/~juk/pgsql/
-	http://www.sra.co.jp/people/t-ishii/PostgreSQL/doc-jp/
-	http://www.linux.or.jp/JF/
-
-  なお、この和訳に関するご意見は(juk@jp.postgresql.org)までお寄せ下さい。
+	この和訳についてお気づきの点は(juk@jp.postgresql.org)までメールでお寄せ下さい。
 ]
 
@@ -79,11 +46,11 @@ HREF="mailto:pgman@candle.pha.pa.us">pgman@candle.pha.pa.us)

1.2) PostgreSQLの著作権はどうなってますか?
1.3) PostgreSQLの動作するUnixプラットホームは?
1.4) Unix以外の移植版で使えるものは?
-1.5) PostgreSQLはどこから手に入りますか?
+1.5) PostgreSQLはどこから入手できますか?
1.6) サポートはどこで受けられますか?
-1.7) 最新版は何ですか
+1.7) 最新版はどれですか
1.8) どのような文書がありますか?
-1.9) 既知のバグや無い機能はどうやって見つけますか?
+1.9) 既知のバグや未だ無い機能はどうやって見つけますか?
1.10) SQLはどうすれば学べますか?
1.11) PostgreSQLは西暦2000年問題(Y2K)に対応していますか?
1.12) 開発チームにはどのように参加しますか?
@@ -95,8 +62,8 @@ HREF="mailto:pgman@candle.pha.pa.us">pgman@candle.pha.pa.us)

2.1) PostgreSQL の ODBC ドライバーはありますか?
2.2) PostgreSQL を Web ページと連携させるにはどんなツールがありますか?
-2.3) PostgreSQL はグラフィカル・ユーザインターフェースを持ちますか? -リポートジェネレータは? 埋め込み問い合わせ言語インターフェースは?
+2.3) PostgreSQL にグラフィカル・ユーザインターフェースはありますか? +レポートジェネレータは? 埋め込み問い合わせ言語インターフェースは?
2.4) PostgreSQL と通信するにはどんな言語が使えますか?
@@ -120,23 +87,24 @@ HREF="mailto:pgman@candle.pha.pa.us">pgman@candle.pha.pa.us)

操作上の質問

4.1) なぜ、システムはカンマや小数点や日付フォーマットで混乱するのですか?
-4.2) バイナリ・カーソルと通常のカーソルとの厳密な違いは何ですか?
+4.2) バイナリ・カーソルと通常カーソルとの厳密な違いは何ですか?
4.3) 最初の数行のみを select するにはどうしますか?
4.4) テーブルやその他の情報のリストを psql で見るにはどうしますか?
-4.5) テーブルからの列の削除はどのようにしますか?
+4.5) テーブルから列の削除はどのようにしますか?
4.6) 行、テーブル、データベースの最大サイズは?
4.7) 一般的なテキストファイルからデータを保存するには、 データベースのディスク容量はどのくらい必要ですか?
-4.8) データベース内に定義されたテーブルやインデックスをどのように見つけ出しますか?
+4.8) データベース内に定義されたテーブルやインデックスをどのようにして見つけ出しますか?
4.9) 問い合わせが遅いうえ、インデックスを使っている様子がありません。なぜですか?
4.10) 問い合わせオブティマイザがどのように問い合わせを評価するかを見るにはどうしますか?
4.11) R-tree インデックスとは何ですか?
4.12) 遺伝的問い合わせ最適化とは何ですか?
-4.13) 正規表現での検索や大文字と小文字とを区別しない正規表現検索はどのように実現しますか?
+4.13) 正規表現での検索や大文字と小文字とを区別しない正規表現検索はどのように実現しますか?大文字と小文字とを区別しない検索のためのインデックスはどのように使いますか? +
4.14) 問い合わせの中で、フィールドが NULL であることを検出するにはどうしますか?
4.15) 色々な文字型のそれぞれの違いは何ですか?
4.16.1) 通番(serial)/自動増分フィールドはどのようにつくりますか?
-4.16.2) SERIALインサートの値はどうすれば得られますか?
+4.16.2) SERIALデータ型に挿入される値は、どうすれば得られますか?
4.16.3) 他のユーザとの競合状態を避けるためには、currval()nextval() は使わないほうがよいのでしょうか?
4.17) OID とは何ですか? TID とは何ですか?
4.18) PostgreSQL で使われるいくつかの用語の意味は何ですか?
@@ -150,7 +118,7 @@ HREF="mailto:pgman@candle.pha.pa.us">pgman@candle.pha.pa.us)

PostgreSQLの拡張についての質問

5.1) 自分で書いたユーザ定義関数を psql の中で実行するとコア・ダンプしてしまうのはなぜですか?
-5.2) PostgreSQL 用に書いた粋な新しい型や関数は、どうすれば寄贈できますか?
+5.2) PostgreSQL 用に書いたちょっと素敵な新しい型や関数を提供してプロジェクトに貢献したいのですが?
5.3) タプルを返す C言語の関数はどのように書きますか?
5.4) ソース・ファイルを変更しました。再コンパイルしても変化が見られないのはなぜですか?

@@ -160,13 +128,13 @@ HREF="mailto:pgman@candle.pha.pa.us">pgman@candle.pha.pa.us)

1.1) PostgreSQL とは何ですか?

-

PostgreSQL は POSTGRES データベース管理システムの改良版で、次世代 DBMS 研究用のプロトタイプです。PostgreSQL は POSTGRES の強力なデータ・モデルと豊富なデータ・タイプ(型)を内包しつつ、POSTGRES で使われた PostQuel 問い合わせ言語を、拡張した SQL のサブセットに置き換えています。PostgreSQL は無料で完全なソースを利用できます。 +

PostgreSQL は次世代 DBMS 研究用のプロトタイプであった POSTGRES データベース管理システムの改良版です。PostgreSQL は POSTGRES の強力なデータ・モデルと豊富なデータ・タイプ(型)を保持しながら、POSTGRES で使われた PostQuel 問い合わせ言語を、拡張した SQL のサブセットに置き換えています。PostgreSQL は無料で完全なソースを利用できます。 -

PostgreSQL のすべての開発は、PostgreSQL 開発メーリングリストに参加しているインターネット上の開発者チームで行なっています。現在の座長は Marc G. Fournier ( scrappy@PostgreSQL.org )です。(以下に参加の仕方があります。)現在、このチームが PostgreSQL開発のすべての 面倒を見ます。 +

PostgreSQL の開発は、PostgreSQL 開発メーリングリストに参加しているインターネット上の開発者チームですべて行なわれています。現在の座長は Marc G. Fournier ( scrappy@PostgreSQL.org )です。(以下に参加の仕方があります。)現在、このチームが PostgreSQL 開発のすべての面倒をみています。 -

PostgreSQL 1.01 の著者は Andrew Yu と Jolly Chen でした。その他大勢の人々がこのコードの移植、テスト、デバグ、および、改良に貢献しました。PostgreSQL の派生元コードである POSTGRES はカリフォルニア大学バークレイ校において、 Michael Stonebraker 教授の指揮のもと、多くの学生、卒業生、職業プログラマたちの努力により作られました。 +

Postgres95-1.01 の中心的な開発者は Andrew Yu と Jolly Chen でしたが、その他大勢の人々がこのコードの移植、テスト、デバグ、および、改良に参加しました。PostgreSQL の派生元コードである POSTGRES はカリフォルニア大学バークレイ校において、 Michael Stonebraker 教授の指揮のもと、多くの学生、卒業生、本職のプログラマたちの努力により作られました。 -

バークレイにおけるこのソフトウェアのもとの名前は Postgres でした。SQL の機能が追加された 1995 年にその名前は Postgres95 に変更されました。1996 年の終りにその名前は PostgreSQL に変更されました。 +

バークレイにおけるこのソフトウェアのもとの名前は Postgres でしたが、SQL の機能が追加された 1995 年にその名前は Postgres95 に変更され、1996 年の終りにその名前は PostgreSQL に変更されました。 Post-Gres-Q-L.(ポスト - グレス - キュー - エル) と発音します。 @@ -182,7 +150,7 @@ HREF="mailto:pgman@candle.pha.pa.us">pgman@candle.pha.pa.us)

PostgreSQL Data Base Management System

-Portions copyright (c) 1996-2000, PostgreSQL Global Development Group +Portions Copyright (c) 1996-2000, PostgreSQL Global Development Group Portions Copyright (c) 1994-6 Regents of the University of California

Permission to use, copy, modify, and distribute this software and its @@ -254,7 +222,7 @@ MODIFICATIONS.

-

1.5) PostgreSQL はどこから手に入りますか?

+

1.5) PostgreSQL はどこから入手できますか?

PostgreSQL の元の anonymous ftp サイトです:

    @@ -304,9 +272,9 @@ MODIFICATIONS. と書いて pgsql-general-digest-request@PostgreSQL.org へ電子メールを送って下さい。 -

    ダイジェスト版は、メインリストが受信するメッセージ 30k 程度溜る毎にダイジェスト版リストのメンバーに送付されます。 +

    ダイジェスト版は、メインリストで受信するメッセージが 30k 程度溜る毎にダイジェスト版リストのメンバーに送付されます。 -

    バグのメーリングリストも利用できます。このリストへの参加は "本文"といっしょに: +

    バグレポート用のメーリングリストもあります。このリストへの参加は "本文"といっしょに: bugs-request@PostgreSQL.org @@ -329,7 +297,7 @@ HREF="mailto:bugs-request@PostgreSQL.org">bugs-request@PostgreSQL.org

    -IRC チャンネルも EFNet にあります。そのチャンネルは #PostgreSQL です。 + EFNet に #PostgreSQL という IRC チャンネルもあります。 unix コマンドでirc -c '#PostgreSQL' "$USER" irc.phoenix.net を使います。

    @@ -361,19 +329,19 @@ unix

    -

    1.7) 最新版は何ですか

    +

    1.7) 最新版はどれですか

    -

    PostgreSQL の最新版はバージョン 7.0.3 です。 +

    PostgreSQL の最新版はバージョン 7.1.2 です。

    我々は、4カ月毎にメジャーリリースを行なうことを計画しています。

    1.8) どのような文書がありますか?

    -

    配付の中に、いくつかのマニュアルとオンライン・マニュアル(マニュアル・ページ)およびいくつかの小さなテスト例題が含まれます。/doc ディレクトリをご覧下さい。また、オンラインでのマニュアルを、 配付の中に、いくつかのマニュアルとオンライン・マニュアル(マニュアル・ページ)およびいくつかの小さなテスト例題が含まれます。/doc ディレクトリをご覧下さい。また、マニュアルは、 http://www.PostgreSQL.org/users-lounge/docs/ -でも閲覧できます。 +でオンラインでも閲覧できます。

    PostgreSQL の本もあります。 @@ -391,7 +359,7 @@ http://www.PostgreSQL.org/docs/awbook.html

    我々の Web サイトには、もっと沢山の文書があります。

    -

    1.9) 既知のバグや無い機能はどうやって見つけますか? +

    1.9) 既知のバグや未だ無い機能はどうやって見つけますか?

    PostgreSQLは拡張されたSQL-92のサブセットをサポートします。 @@ -400,7 +368,7 @@ PostgreSQL TODO リストに、既知のバグや欠落機能や将来計画についての記述があります。

    -

    1.10) SQL はどのように学べば良いですか?

    +

    1.10) SQL はどうすれば学べますか?

    http://www.PostgreSQL.org/docs/awbook.html @@ -532,18 +500,19 @@ PostgreSQL

    サポート(Support)
    -我々のメーリングリストは、遭遇するどんな問題についても解決を助けてくれ -る、開発者やユーザの膨大なグループを擁しています。我々は問題の解決を保 -証することはできませんが、商用データベースであっても常に解決されるわけ -ではありません。開発者達、ユーザ・コミュニティ、マニュアル類、それに、 -ソースコードなどに直接アクセスできることよって、PostgreSQLのサポートは、 -他のDBMSサポートよりも優れたものとなっています。御要望に答えて、事柄毎 -の商用サポートもあります(サポートFAQ項目をご覧下さい)。 + 我々のメーリングリストは、遭遇するいかなる問題についても解決への手 +助けをしてくれる、開発者やユーザの大きな集まりを提供しています。我々は +問題の解決を保証することはできませんが、商用データベースであっても常に +解決されるわけではありません。開発者や、ユーザ・コミュニティ、マニュア +ル類、それに、ソースコードなどへ直接アクセスできることよって、 +PostgreSQLのサポートは、他のDBMSサポートよりも優れたものとなっています。 +御要望に答えて、事柄毎の商用サポートなどもあります(サポートFAQ項目をご覧 +下さい)。
    価格(Price)
    -PostgreSQLの使用は、商用でも非商用でも、すべて無料です。上記に示してあ +PostgreSQLの利用は、商用でも非商用でも、すべて無料です。上記に示してあ るBSDスタイルの使用許諾に外れない限り、PostgreSQLのコードを制限無しで 商品に組み込むことができます。

    @@ -605,9 +574,7 @@ Programmer's Guide ] -

    複雑な場合、多くの人は Perl インターフェースと CGI.pm を使います。 - -

    Perl を使った WDB を基にした WWW ゲートウェイはhttp://www.eol.ists.ca/~dunlop/wdb-p95からダウンロードできます。 +

    処理が複雑な場合、多くの人は Perl インターフェースと CGI.pm を使います。

         [訳注:
    @@ -622,7 +589,8 @@ Programmer's Guide
     

    -

    2.3) PostgreSQL はグラフィカル・ユーザ・インターフェースを持っていますか? レポート・ジェネレータは? 埋め込み問い合わせ言語へのインターフェースは? +

    2.3) PostgreSQL にグラフィカル・ユーザインターフェースはありますか? +レポート・ジェネレータは? 埋め込み問い合わせ言語へのインターフェースは?

    pgaccess と呼ばれる素晴らしいグラフィカル・ユーザ・インターフェースがあり、この配布と共に出荷されます。Pgaccess にはレポート・ジェネレータもあります。Web ページはhttp://www.flex.ro/pgaccessです。 @@ -657,6 +625,8 @@ Programmer's Guide PgBash は 境田 雅明 さんが作った bash の PostgreSQL インターフェースです。 http://www.psn.co.jp/PostgreSQL/pgbash/ Bashコマンドラインでpostgres に問い合わせできます。 + Perl のモジュールは古くからある Pg と DBI ドライバの DBD::Pg とがあり、 + いずれも Edmund Mergl 氏によるもので CPAN サイトにあります。 ] @@ -706,7 +676,7 @@ PostgreSQL Administrator's Gide

    既定の設定ではローカルマシンからの unix ドメインのソケット接続しか許しません。TCP/IP 接続を可能にするには postmaster が -i オプションで開始されていて、pgsql/data/pg_hba.conf ファイルに適切なホストの記載が追加されていることを確認してください。

    -

    3.7) よりよい性能を得るために、どのようにデータベース・エンジンを調整できますか? +

    3.7) より良い性能を得るためには、データベース・エンジンをどのように調整すれば良いですか?

    確かにインデックスは問い合わせの速度を増します。EXPLAINコマンドで PostgreSQL がどのようにあなたの問い合わせを翻訳しているかを見ることができ、そして、どのインデックスが使われているかを見ることができます。 @@ -770,7 +740,7 @@ PostgreSQL

    問い合わせ実行モジュールによって生成された一時的なファイルです。例えば、もし ORDER BY 句を満たすためにバックエンドの -S パラメータで許可した値よりも大きなスペースがソートの際に必要だとすると、溢れたデータを保持するために一時的なファイルがいくつか生成されます。

    -一時的なファイルは自動的に消し去られるはずですが、もし、ソートの途中でバックエンドが潰れてしまうとそうなりません。もし、そのときバックエンドがひとつも走ってなければ、pg_tempNNN.NNファイルを消しても安全です。 +一時的なファイルは自動的に消し去られるはずですが、もし、ソートの途中でバックエンドがクラッシュしてしまうとそうはなりません。そのときバックエンドがひとつも走ってなければ、pg_tempNNN.NNファイルを消しても大丈夫です。

    @@ -798,13 +768,13 @@ PostgreSQL
     

    ロケールの設定を確かめて下さい。PostgreSQL は postmaster プロセスを走らせたユーザーのロケールの設定を使います。postgres とpsql には SET コマンドがあり、データ書式を制御できます。これらをあなたの操作環境に合わせて設定して下さい。

    -

    4.2) バイナリ・カーソルと通常のカーソルとの厳密な違いは何ですか? +

    4.2) バイナリ・カーソルと通常カーソルとの厳密な違いは何ですか?

    詳述は、オンラインマニュアルで DECLARE を見て下さい。

    -

    4.3) 問い合わせの最初の数行のみを SELECT するにはどうしますか? +

    4.3) 最初の数行のみを SELECT するにはどうしますか?

    オンラインマニュアルでFETCHを見てください。あるいは、SELECT ... LIMIT....を使ってみて下さい。 @@ -817,12 +787,12 @@ PostgreSQL

    - psqlのソースコードが書かれた pgsql/src/bin/psql/describe.c ファイルを読むことができます。 + psqlのソースコードとして書かれた pgsql/src/bin/psql/describe.c ファイルを読むことがその答えです。 そこには、psqlのバックスラッシュコマンドによる出力のためのSQLコマンドが含まれています。 psql-E オプションをつけて起動すれば、与えたコマンドを実行するための問い合わせが出力されます。

    -

    4.5) テーブルからの列の削除はどのようにしますか? +

    4.5) テーブルから列の削除はどのようにしますか?

    ALTER TABLE DROP COLUMN はサポートしていませんが、その代わりにこうします: @@ -855,7 +825,7 @@ PostgreSQL

    もちろん、これらは実際は無制限ではなく、ディスク容量とメモリーやスワップスペースの大きさにより制限されます。性能はこれらの値がことのほか大きな時に煽りを受けます。 -

    最大テーブルサイズの16TBはオペレーティングシステムのラージ・ファイルサポートは必要としません。ラージ・テーブルは複数の1GBのファイルのように保存されます。 +

    最大テーブルサイズの16TBはオペレーティングシステムによる巨大ファイルのサポートは必要としません。巨大なテーブルは複数の1GBのファイルに分けて保存されますので、ファイルシステムの制限は重要ではありません。

    デフォルトのブロックサイズを32kにすると最大テーブルサイズと最大カラム数とが増加します。 @@ -891,7 +861,7 @@ PostgreSQL インデックスは、これほどのオーバヘッドは要求しませんが、インデックス付けされるデータを含む以上、それなりに大きくなります。

    -

    4.8) データベース内に定義されたテーブルやインデックスをどのように見つけ出しますか? +

    4.8) データベース内に定義されたテーブルやインデックスをどのようにして見つけ出しますか?

    psql にはいろいろなバックスラッシュ・コマンドがあり、こうした情報を表示します。バックスラッシュ・コマンドの種類を見るには \? を使って下さい。 @@ -905,7 +875,7 @@ PostgreSQL

    列特定の最適化統計のためにVACUUM ANALYZEを使います。VACUUM ANALYZEは複雑な複合結合(multi-join)問い合わせのために大切ですので、オブティマイザはそれぞれのテーブルから返される行の数を見積ることができ、特定の結合順序を選びます。バックエンドはそれ自身では列の統計を保持しないので、定期的にそれらを集めるためには VACUUM ANALYZE を走らせなくてはなりません。 -

    インデックスは ORDER BY 操作のためには普通は使われません。すなわち、順次スキャンに続く明示的ソートは、ディスクアクセスがより少なくて済むので、巨大なテーブルの全件をインデックススキャンするよりも高速です。 +

    普通、インデックスは ORDER BY や結合の操作のためには使われません。ランダムなディスクアクセスはとても遅いので、順次スキャンに続く明示的ソートは、巨大なテーブルの全件をインデックススキャンするよりも高速です。

    LIKE あるいは ~ のようなワイルドカード演算子(wild-card operators)を使うとき、検索の開始が文字列の始めの部分に固定されているときにのみ、インデックスが使われます。 そういうわけで、インデックスを使うためには、LIKE 検索では%で始めないようにして、また、~(正規表現検索)は^ で始めるようにするべきです。 @@ -962,13 +932,31 @@ Proc of the 1984 ACM SIGMOD Int'l Conf on Mgmt of Data, 45-57.

    GEQO モジュールは、沢山のテーブルを結合するときに、遺伝的アルゴリズム(GA)で問合わせを高速化します。これにより、しらみつぶしに探索を行なわなくても、大きな結合(join queries)を扱うことができるようになります。

    -

    4.13) 正規表現での検索や大文字と小文字とを区別しない正規表現検索はどのように実現しますか? +

    4.13) 正規表現での検索や大文字と小文字とを区別しない正規表現検索はどのように実現しますか?大文字と小文字とを区別しない検索のためのインデックスはどのように使いますか?

    ~演算子は正規表現照合を行ない、~* は大文字と小文字を区別しない(case-insensitive)正規表現照合を行います。 PostgreSQL 7.1 以降では、大文字と小文字を区別しない LIKE 演算子を ILIKE といいます。 +

    大文字と小文字を区別しない等値比較次のように表現できる: + +

    +    SELECT *
    +    FROM tab
    +    WHERE lower(col) = 'abc'
    +    
    + +標準インデックスでは使われず、しかしながら、もし関数インデックスを +作ったならそれが使われるでしょう。 + +
    +   CREATE INDEX tabindex on tab (lower(col));
    +   
    + + + +
     	WHERE lower(textfield) LIKE lower(pattern)
     
    @@ -1026,18 +1014,16 @@ BYTEA bytea Bruce Momjian の(http://www.PostgreSQL.org/docs/aw_pgsql_book)の Numbering Rowsの章にありあます。 -

    4.16.2) SERIALインサートの値はどうすれば得られますか? +

    4.16.2) SERIALデータ型に挿入される値は、どうすれば得られますか?

    - - ひとつの方法は、nextval() 関数で挿入する前に(before) SEQUENCEオブジェクトから次のSERIAL値を取り出し、それから実際に挿入をすることでしょう。 -4.16.1の例で使ったテーブルを使うとすると、次のようになるでしょう。 + ひとつの方法は、nextval() 関数を使ってその値を挿入する前(before)に SEQUENCE オブジェクトから次の SERIAL 値を取り出し、それから実際に挿入をすることです。 4.16.1 の例で使ったテーブルを使うとすると、次のようになります。

     	$newSerialID = nextval('person_id_seq');
     	INSERT INTO person (id, name) VALUES ($newSerialID, 'Blaise Pascal');
     
    -そうして、$newSerialID に保存した新しい値を他の問い合わせに(たとえば、person テーブルに対する外部鍵(foreign key)のように)使うとよいでしょう。自動的に作られたSEQUENCEオブジェクトの名前は、<table>_<serialcolumn>_seq のようになり、このうち、tableserialcolumn はそれぞれテーブルの名前とSERIAL列の名前です。 +そうして、$newSerialID に保存した新しい値を他の問い合わせに(たとえば、person テーブルに対する外部キー(foreign key)のように)使うとよいでしょう。自動的に作られたSEQUENCEオブジェクトの名前は、<table>_<serialcolumn>_seq のようになり、このうち、tableserialcolumn はそれぞれテーブルの名前とSERIAL列の名前です。

    あるいは、与えられたSERIAL値を、それが既定値として挿入された後で(after)currval() 関数を使って取り出すこともできます。たとえば、 @@ -1047,27 +1033,29 @@ BYTEA bytea $newID = currval('person_id_seq');

    -最後に、INSERT文から返るOIDを使って、既定値をみつけることもできますが、しかし、これは最も移植性の低いやり方でしょう。PerlのDBIで Edmund Mergl の DBD::Pg モジュールを使えば、$sth->execute() の後に $sth->{pg_oid_status} を経由してその OID 値を使えるようにすることはできます。 +最後に、INSERT文から返るOIDを使って、既定値をみつけることもできますが、しかし、これは最も移植性の低いやり方でしょう。PerlのDBIで Edmund Mergl の作った DBD::Pg モジュールを使えば、$sth->execute() の後に $sth->{pg_oid_status} を経由してその OID 値を使えるようにすることはできます。

    4.16.3) 他のユーザとの競合状態を避けるためには、currval()nextval() は使わないほうがよいのでしょうか?

    -ありません。バックエンドで処理されています。 +バックエンドが上手に処理するので、競合状態になることは有りません。

    4.17) OID とは何ですか? TID とは何ですか?

    -

    OID とは一意の行 ID に対する PostgreSQL の答えです。PostgreSQL の中でつくられるすべての行は一意の OID を得ます。initdb で(backend/access/transam.h から)発生される OID はすべて 16384より小さな値です。initdb 後のすべての OID (ユーザ作成)はそれ以上の値になります。既定では、これらすべての OID はテーブル内やデータベース内に留まらず、PostgreSQL のそのインストレーション全体内で一意であります。 +

    OID とは一意の行 ID に対する PostgreSQL の答えです。PostgreSQL の中でつくられるすべての行は一意の OID を得ます。initdb で発生される OID はすべて 16384 (backend/access/transam.h から)より小さな値です。initdb 後のすべての OID (ユーザ作成)はそれ以上の値になります。 +既定では、これらすべての OIDは一つのデーブルやデータベース内に留まらず、PostgreSQL インストレーション全体の中で一意です。

    PostgreSQL はテーブル間の行を結びつけるために、そのシステムテーブル内に OID を使います。この OID は特定のユーザの行を識別するためや結合の中で使われることができます。OID の値を保存するためには OID 型を列に使うことを奨めます。より速くアクセスするために OID フィールドにインデックスを作ることができます。 -

    OID は、全てのデータベースから使われる中央領域から、全ての新しい行に割り当てられます。OID を他の何かに変えたい、もしくは元の OID でテーブルをコピーしたいのなら、そうできない理由はありません。 + OID は、全てのデータベースで使われる中央領域から、全ての新しい行に割り当てられます。OID を他の何かに変えたい、あるいは元の OID もテーブルと一緒にコピーしたいのなら、できなくはありません。 +

    -        CREATE TABLE new_table(old_oid oid, mycol int);
    +        CREATE TABLE new (old_oid oid, mycol int);
             SELECT old_oid, mycol INTO new FROM old;
             COPY new TO '/tmp/pgtable';
             DELETE FROM new;
    @@ -1108,9 +1096,9 @@ http://www.comptechnews.com/~reaster/dbdesign.html
     

    4.19) エラーメッセージ "ERROR: Memory exhausted in AllocSetAlloc()"が出るのはなぜですか?

    -システムの仮想メモリーを全て使い果たしてしまっている可能性があるか、あるいは -カーネルがあるリソースについて低い制限値を持っている可能性があります。 -postmaster を開始する前にこれを試してみて下さい: +もし、7.1 よりも古いバージョンをお使いの場合は、アップデートによってこの問題を +解決できるでしょう。それと、システムの仮想メモリーを全て使い果たしてしまっている可能性があるか、カーネルがあるリソースについてもつ制限値が低すぎる可能性があります。 +postmaster を始動する前にこれを試してみて下さい:

     	ulimit -d 262144
    @@ -1202,11 +1190,11 @@ PostgreSQL 7.1 
     

    5.1) 自分で書いたユーザ定義関数を psql の中で実行するとコア・ダンプしてしまうのはなぜですか?

    -

    問題は色々と考えられます。まず最初に、作成したユーザ定義関数を単独のテストプログラムにして試してみて下さい。 +

    問題は色々と考えられますが、まず最初に、作成したユーザ定義関数を単独のテストプログラムにして試してみて下さい。

    -

    5.2) PostgreSQL 用に書いた粋な新しい型や関数は、どうすれば寄贈できますか? +

    5.2) PostgreSQL 用に書いたちょっと素敵な新しい型や関数を提供してプロジェクトに貢献したいのですが?

    皆さんの行なった拡張を、pgsql-hackers メーリング・リストに送ってください。そして、ゆくゆくはそうした拡張が contrib/ サブディレクトリの中に入ることになるでしょう。 @@ -1227,6 +1215,39 @@ PostgreSQL 7.1

     [訳注:
    +  日本語版の製作については以下の通りです。
    +
    +  最終更新日:	2001年07月05日
    +  翻訳者:	桑村 潤 (Jun Kuwamura <juk@jp.postgresql.org>)
    +
    +  このFAQの和訳の作成にあたり協力をしてくださった方々(敬称は略させていただきます):
    +
    +		田仲 稔(Minoru Tanaka <Tanaka.Minoru@keiken.co.jp>)
    +		石井 達夫(Tatsuo Ishii <t-ishii@sra.co.jp>)
    +		齊藤 知人(Tomohito Saitoh <tomos@elelab.nsc.co.jp>)
    +		馬場  肇(Hajime Baba <baba@kusastro.kyoto-u.ac.jp>)
    +		岡本 一幸(Kazuyuki Okamoto <kokamoto@itg.hitachi.co.jp>)
    +		小菅 昭一(Shoichi Kosuge <s-kosuge@str.hitachi.co.jp>)
    +		山下 義之(Yoshiyuki Yamashita <dica@eurus.dti.ne.jp>)
    +		境 真太郎(Sintaro Sakai <s_sakai@mxn.mesh.ne.jp>)
    +		生越 昌己(Masami Ogoshi <ogochan@zetabits.com>)
    +		石川 俊行(Toshiyuki Ishikawa <tosiyuki@gol.com>)
    +		本田 茂広(Shigehiro Honda <fwif0083@mb.infoweb.ne.jp>)
    +		せせ じゅん(Jun Sese <sesejun@linet.gr.jp>)
    +		神谷 英孝(Hidetaka Kamiya <hkamiya@catvmics.ne.jp>)
    +
    +  をはじめ、ポストグレスに関する話題豊富な日本語ポストグレス・メーリングリスト、
    +  和訳のきっかけを作ってくれた JF(Linux Japanese FAQ Mailing List)プロジェクト、その他、
    +  直接あるいは間接的にかかわっているすべてのオープンソースコミュニティーの
    +  皆さんに感謝します。
    +
    +
    +  日本語版のこの文書は、以下からもたどれます。
    +	http://www.rccm.co.jp/~juk/pgsql/(FAQ和訳 PostgreSQL についてよくある質問)
    +	http://www.linux.or.jp/JF/(PostgreSQL-FAQ.j)
    +	http://www.sra.co.jp/people/t-ishii/PostgreSQL/doc-jp/
    +
    +  なお、この和訳に関するご意見は(juk@jp.postgresql.org)までお寄せ下さい。
     ]
     
    diff --git a/src/backend/libpq/auth.c b/src/backend/libpq/auth.c index 42078e2983..682eede37b 100644 --- a/src/backend/libpq/auth.c +++ b/src/backend/libpq/auth.c @@ -8,17 +8,22 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/libpq/auth.c,v 1.62 2001/08/17 15:44:17 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/libpq/auth.c,v 1.63 2001/08/21 00:33:27 momjian Exp $ * *------------------------------------------------------------------------- */ #include "postgres.h" -#include /* needed by in.h on Ultrix */ +#include +#include /* for SCM_CREDS */ +#ifdef SCM_CREDS +#include /* for struct iovec */ +#include +#include +#endif #include #include - #include "libpq/auth.h" #include "libpq/crypt.h" #include "libpq/hba.h" @@ -28,12 +33,10 @@ #include "miscadmin.h" static void sendAuthRequest(Port *port, AuthRequest areq); - static int checkPassword(Port *port, char *user, char *password); static int old_be_recvauth(Port *port); static int map_old_to_new(Port *port, UserAuth old, int status); static void auth_failed(Port *port); - static int recv_and_check_password_packet(Port *port); static int recv_and_check_passwordv0(Port *port); @@ -493,6 +496,26 @@ ClientAuthentication(Port *port) break; case uaIdent: +#if !defined(SO_PEERCRED) && defined(SCM_CREDS) + /* + * If we are doing ident on unix-domain sockets, + * use SCM_CREDS only if it is defined and SO_PEERCRED isn't. + */ +#ifdef fc_uid + /* Receive credentials on next message receipt, BSD/OS */ + { + int on = 1; + if (setsockopt(port->sock, 0, LOCAL_CREDS, &on, sizeof(on)) < 0) + { + elog(FATAL, + "pg_local_sendauth: can't do setsockopt: %s\n", strerror(errno)); + return; + } + } +#endif + if (port->raddr.sa.sa_family == AF_UNIX) + sendAuthRequest(port, AUTH_REQ_SCM_CREDS); +#endif status = authident(port); break; @@ -676,3 +699,4 @@ map_old_to_new(Port *port, UserAuth old, int status) return status; } + diff --git a/src/backend/libpq/hba.c b/src/backend/libpq/hba.c index cfafa712e1..26a56e567c 100644 --- a/src/backend/libpq/hba.c +++ b/src/backend/libpq/hba.c @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/libpq/hba.c,v 1.64 2001/08/16 16:24:15 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/libpq/hba.c,v 1.65 2001/08/21 00:33:27 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -18,9 +18,13 @@ #include #include -#include #include -#include +#include +#include /* for SCM_CREDS */ +#ifdef SCM_CREDS +#include /* for struct iovec */ +#include +#endif #include #include #include @@ -876,39 +880,103 @@ ident_unix(int sock, char *ident_user) { /* We didn't get a valid credentials struct. */ snprintf(PQerrormsg, PQERRORMSG_LENGTH, - "Could not get valid credentials from the UNIX socket: %s\n", + "ident_unix: error receiving credentials: %s\n", strerror(errno)); fputs(PQerrormsg, stderr); pqdebug("%s", PQerrormsg); return false; } - /* Convert UID to user login name */ pass = getpwuid(peercred.uid); if (pass == NULL) { - /* Error - no username with the given uid */ snprintf(PQerrormsg, PQERRORMSG_LENGTH, - "There is no entry in /etc/passwd with the socket's uid\n"); + "ident_unix: unknown local user with uid %d\n", fputs(PQerrormsg, stderr); pqdebug("%s", PQerrormsg); return false; } - StrNCpy(ident_user, pass->pw_name, IDENT_USERNAME_MAX); + StrNCpy(ident_user, pass->pw_name, IDENT_USERNAME_MAX+1); return true; -#else /* not SO_PEERCRED */ +#elif defined(SCM_CREDS) + struct msghdr msg; +/* Credentials structure */ +#ifndef fc_uid + typedef struct cmsgcred Cred; +#define cruid cmcred_uid +#else + typedef struct fcred Cred; +#define cruid fc_uid +#endif + Cred *cred; + + /* Compute size without padding */ + char cmsgmem[sizeof(struct cmsghdr) + sizeof(Cred)]; + /* Point to start of first structure */ + struct cmsghdr *cmsg = (struct cmsghdr *)cmsgmem; + + struct iovec iov; + char buf; + struct passwd *pw; + + memset(&msg, 0, sizeof(msg)); + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + msg.msg_control = (char *)cmsg; + msg.msg_controllen = sizeof(cmsgmem); + memset(cmsg, 0, sizeof(cmsgmem)); + + /* + * The one character which is received here is not meaningful; + * its purposes is only to make sure that recvmsg() blocks + * long enough for the other side to send its credentials. + */ + iov.iov_base = &buf; + iov.iov_len = 1; + + if (recvmsg(sock, &msg, 0) < 0 || + cmsg->cmsg_len < sizeof(cmsgmem) || + cmsg->cmsg_type != SCM_CREDS) + { + snprintf(PQerrormsg, PQERRORMSG_LENGTH, + "ident_unix: error receiving credentials: %s\n", + strerror(errno)); + fputs(PQerrormsg, stderr); + pqdebug("%s", PQerrormsg); + return false; + } + + cred = (Cred *)CMSG_DATA(cmsg); + + pw = getpwuid(cred->fc_uid); + if (pw == NULL) + { + snprintf(PQerrormsg, PQERRORMSG_LENGTH, + "ident_unix: unknown local user with uid %d\n", + cred->fc_uid); + fputs(PQerrormsg, stderr); + pqdebug("%s", PQerrormsg); + return false; + } + + StrNCpy(ident_user, pw->pw_name, IDENT_USERNAME_MAX+1); + + return true; + +#else snprintf(PQerrormsg, PQERRORMSG_LENGTH, - "IDENT auth is not supported on local connections on this platform\n"); + "'ident' auth is not supported on local connections on this platform\n"); fputs(PQerrormsg, stderr); pqdebug("%s", PQerrormsg); + return false; -#endif /* SO_PEERCRED */ +#endif } /* diff --git a/src/backend/libpq/pg_hba.conf.sample b/src/backend/libpq/pg_hba.conf.sample index d7498717b5..9605dfb3e8 100644 --- a/src/backend/libpq/pg_hba.conf.sample +++ b/src/backend/libpq/pg_hba.conf.sample @@ -127,12 +127,12 @@ # ident: For TCP/IP connections, authentication is done by contacting # the ident server on the client host. (CAUTION: this is only # as secure as the client machine!) On machines that support -# SO_PEERCRED socket requests, this method also works for -# local Unix-domain connections. AUTH_ARGUMENT is required: -# it determines how to map remote user names to Postgres user -# names. The AUTH_ARGUMENT is a map name found in the -# $PGDATA/pg_ident.conf file. The connection is accepted if -# that file contains an entry for this map name with the +# SO_PEERCRED or SCM_CREDS socket requests, this method also +# works for local Unix-domain connections. AUTH_ARGUMENT is +# required: it determines how to map remote user names to +# Postgres user names. The AUTH_ARGUMENT is a map name found +# in the $PGDATA/pg_ident.conf file. The connection is accepted +# if that file contains an entry for this map name with the # ident-supplied username and the requested Postgres username. # The special map name "sameuser" indicates an implied map # (not in pg_ident.conf) that maps each ident username to the diff --git a/src/include/libpq/pqcomm.h b/src/include/libpq/pqcomm.h index 57a7e79696..48e304d975 100644 --- a/src/include/libpq/pqcomm.h +++ b/src/include/libpq/pqcomm.h @@ -9,7 +9,7 @@ * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: pqcomm.h,v 1.57 2001/08/16 04:27:18 momjian Exp $ + * $Id: pqcomm.h,v 1.58 2001/08/21 00:33:27 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -133,6 +133,7 @@ typedef struct StartupPacket #define AUTH_REQ_PASSWORD 3 /* Password */ #define AUTH_REQ_CRYPT 4 /* crypt password */ #define AUTH_REQ_MD5 5 /* md5 password */ +#define AUTH_REQ_SCM_CREDS 6 /* transfer SCM credentials */ typedef uint32 AuthRequest; diff --git a/src/interfaces/libpq/fe-auth.c b/src/interfaces/libpq/fe-auth.c index e26a9c271b..72c37bd120 100644 --- a/src/interfaces/libpq/fe-auth.c +++ b/src/interfaces/libpq/fe-auth.c @@ -10,7 +10,7 @@ * exceed INITIAL_EXPBUFFER_SIZE (currently 256 bytes). * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-auth.c,v 1.55 2001/08/17 15:40:07 momjian Exp $ + * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-auth.c,v 1.56 2001/08/21 00:33:27 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -30,6 +30,7 @@ #include "postgres_fe.h" +/* XXX is there a reason these appear before the system defines? */ #include "libpq-fe.h" #include "libpq-int.h" #include "fe-auth.h" @@ -40,6 +41,13 @@ #else #include #include +#include +#include +#include /* for SCM_CREDS */ +#ifdef SCM_CREDS +#include /* for struct iovec */ +#include +#endif #include /* for MAXHOSTNAMELEN on most */ #ifndef MAXHOSTNAMELEN #include /* for MAXHOSTNAMELEN on some */ @@ -428,6 +436,53 @@ pg_krb5_sendauth(char *PQerrormsg, int sock, #endif /* KRB5 */ +#ifdef SCM_CREDS +static int +pg_local_sendauth(char *PQerrormsg, PGconn *conn) +{ + char buf; + struct iovec iov; + struct msghdr msg; +#ifndef fc_uid + /* Prevent padding */ + char cmsgmem[sizeof(struct cmsghdr) + sizeof(struct cmsgcred)]; + /* Point to start of first structure */ + struct cmsghdr *cmsg = (struct cmsghdr *)cmsgmem; +#endif + + /* + * The backend doesn't care what we send here, but it wants + * exactly one character to force recvmsg() to block and wait + * for us. + */ + buf = '\0'; + iov.iov_base = &buf; + iov.iov_len = 1; + + memset(&msg, 0, sizeof(msg)); + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + +#ifndef fc_uid + /* Create control header, FreeBSD */ + msg.msg_control = cmsg; + msg.msg_controllen = sizeof(cmsgmem); + memset(cmsg, 0, sizeof(cmsgmem)); + cmsg.hdr.cmsg_len = sizeof(cmsgmem); + cmsg.hdr.cmsg_level = SOL_SOCKET; + cmsg.hdr.cmsg_type = SCM_CREDS; +#endif + + if (sendmsg(conn->sock, &msg, 0) == -1) + { + snprintf(PQerrormsg, PQERRORMSG_LENGTH, + "pg_local_sendauth: sendmsg: %s\n", strerror(errno)); + return STATUS_ERROR; + } + return STATUS_OK; +} +#endif + static int pg_password_sendauth(PGconn *conn, const char *password, AuthRequest areq) { @@ -473,12 +528,13 @@ pg_password_sendauth(PGconn *conn, const char *password, AuthRequest areq) crypt_pwd = crypt(password, salt); break; } - default: + case AUTH_REQ_PASSWORD: /* discard const so we can assign it */ crypt_pwd = (char *)password; break; + default: + return STATUS_ERROR; } - ret = pqPacketSend(conn, crypt_pwd, strlen(crypt_pwd) + 1); if (areq == AUTH_REQ_MD5) free(crypt_pwd); @@ -551,6 +607,18 @@ fe_sendauth(AuthRequest areq, PGconn *conn, const char *hostname, return STATUS_ERROR; } break; + + case AUTH_REQ_SCM_CREDS: +#ifdef SCM_CREDS + if (pg_local_sendauth(PQerrormsg, conn) != STATUS_OK) + return STATUS_ERROR; +#else + snprintf(PQerrormsg, PQERRORMSG_LENGTH, + libpq_gettext("SCM_CRED authentication method not supported\n")); + return STATUS_ERROR; +#endif + break; + default: snprintf(PQerrormsg, PQERRORMSG_LENGTH, libpq_gettext("authentication method %u not supported\n"), areq); diff --git a/src/interfaces/odbc/connection.c b/src/interfaces/odbc/connection.c index 1e6167098e..54e448892b 100644 --- a/src/interfaces/odbc/connection.c +++ b/src/interfaces/odbc/connection.c @@ -726,6 +726,11 @@ CC_connect(ConnectionClass *self, char do_password) self->errornumber = CONN_AUTH_TYPE_UNSUPPORTED; return 0; + case AUTH_REQ_SCM_CREDS: + self->errormsg = "Unix socket credential authentication not supported"; + self->errornumber = CONN_AUTH_TYPE_UNSUPPORTED; + return 0; + default: self->errormsg = "Unknown authentication type"; self->errornumber = CONN_AUTH_TYPE_UNSUPPORTED; diff --git a/src/interfaces/odbc/connection.h b/src/interfaces/odbc/connection.h index 67fb38dcaa..11379e4f2f 100644 --- a/src/interfaces/odbc/connection.h +++ b/src/interfaces/odbc/connection.h @@ -94,6 +94,7 @@ typedef enum #define AUTH_REQ_PASSWORD 3 #define AUTH_REQ_CRYPT 4 #define AUTH_REQ_MD5 5 +#define AUTH_REQ_SCM_CREDS 6 /* Startup Packet sizes */ #define SM_DATABASE 64