PostgreSQL 7.1.1 の使い方
2001-06-03 作成 福島
2001-06-15 更新 福島
2001-09-12 更新 福島
2001-10-31 更新 福島
2001-11-19 更新 福島

6 はこちら

・postmaster の起動と停止 $ su # su - postgres $ /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start …… 起動 $ /usr/local/pgsql/bin/pg_ctl stop …… 通常停止 $ /usr/local/pgsql/bin/pg_ctl -m f stop …… 強制停止 (ユーザのトランザクションが強制終了される) ・システムDB (postgres) の作成 ユーザの追加/削除はシステムDBとは関係ないが、 各ユーザのパスワードファイルはシステムDBのテーブルに格納される。 ※認証を crypt にしないなら作成の必要はありません # su - postgres postgres$ createdb postgres ・ユーザの追加と削除 (ユーザ:postgres で行う) DB をアクセスするユーザは UNIX のユーザとは無関係です。 唯一、'postgres' というユーザだけが関係します。 # su - postgres ユーザの追加 (31バイトまで,[A-Za-z0-9_][A-Za-z0-9_\-]*) postgres$ createuser UserName Shall the new user be allowed to create databases? (y/n) y ……… DB作成権を与える Shall the new user be allowed to create more new users? (y/n) n ……… 特権は与えない CREATE USER ユーザの削除 postgres$ dropuser UserName DROP USER postgres$ exit # exit $
・data/pg_hba.conf の編集 #local all trust #host all 127.0.0.1 255.255.255.255 trust local postgres trust ……… システムDB local template1 trust ……… 〃 local DBName crypt ……… ユーザDB ・書式 host DBName IPAddress NetMask AuthType AuthType ident ident による認証 trust 認証なし reject 接続拒否 password file pg_passwd data/file による認証 crypt テーブル pg_shadow による認証 kbr4 KerberosV4 による認証 kbr5 KerberosV5 による認証
・crypt パスワードの設定 上記 crypt の設定行で参照されるユーザのパスワードを設定する。 $ su # su - postgres postgres$ psql postgres …… DB 名を省略すると postgres が使用される postgres=# create user UserName with password 'Password'; …… ユーザを登録 postgres=# alter user UserName with password 'Password'; …… パスワードを変更 postgres=# \q …… psql を終了 postgres$
・password パスワードの設定 上記 password の設定行で参照されるユーザのパスワードを設定する。 $ su # su - postgres postgres$ pg_passwd data/file File "data/file" does not exist. Create? (y/n): y Username: UserName New password: ******** Re-enter new password: ******** postgres$ /etc/passwd に似たような構造なので、ユーザを削除するときはその行を削除する。 ※パスワードは crypt で格納されている。 ※ pg_passwd はユーザ postgres だけが実行可能なので、  他のユーザが自分でパスワードを変更することは出来ない。
・DB ホストとしての稼動 通常、PostgreSQL はローカルからの接続 (UNIX ドメインソケット) しか許可しない。 DB ホストとして他ホストからの要求に応えるためには TCP/IP を指定して postmaster を起動する。 - data/postgresql.conf から指定する場合は tcpip_socket = true とする。 - pg_ctl から指定する場合は pg_ctl -o '-i' とする。 pg_hba.conf でホストのアドレスを制限するのは云うまでも無い。 このときの動作は、なぜか (TCP) コネクトしてから拒否する。 コネクト出来ないんだから、ソケットレベルで切断すれば良いと思うが…。 クライアント側の接続方法 psql -p Port -h DBHostName -U User
・DBの作成と削除 DB の作成 (1) $ su # su - postgres postgres$ createdb DBName DB の作成 (2) $ su # su - UserName UserName$ createdb DBName 省略時は UserName がDB名になる DB の作成 (3) $ createdb -U UserName DBName ユーザを指定して DB を作成 DB の削除 $ su # su - postgres postgres$ dropdb DBName
・psql の操作 $ psql -U UserName DBName UserName としてログインし DBName を操作する場合 (1) DBName=> $ su - UserName UserName$ psql DBName UserName としてログインし DBName を操作する場合 (2) DBName=> $ su - UserName UserName$ psql … 操作する DB 名が UserName と同一の場合はこちらでも可 DBName=# プロンプトに注目 $ psql -l … DBName 一覧の表示 テーブルの作成 $ psql DBName DBName=> create table TableName (TermName text, TermValue int) ; DBName=> create table TableName (idx int primary key, TermValue int) ; テーブルの確認 DBName=> \d Tablename Attribute | Type | Modifier -----------+------+---------- TermName | text | TermValue | int | データの挿入 DBName=> insert into TableName (Term1,Term2) values (100,150) ; あるいは DBName=> insert into TableName values ('Term1', 100) ; DBName=> insert into TableName values ('Term2', 150) ; DBName=> select * from TableName; TermName|TermValue --------+--------- Term1 | 100 Term2 | 150 (2 rows) 特定のデータに 10 を加算 (対象は TermValue) DBName=> update TableName set TermValue = TermValue +10 where TermName = 'Term1'; DBName=> select * from TableName; TermName|TermValue --------+--------- Term1 | 110 Term2 | 150 (2 rows) 全てのデータに 10 を加算 (対象は TermValue) DBName=> update TableName set TermValue = TermValue +10; DBName=> select * from TableName; TermName|TermValue --------+--------- Term1 | 120 Term2 | 160 (2 rows) 特定のデータを削除 DBName=> delete from TableName where TermName = 'Term1'; DBName=> select * from TableName; TermName|TermValue --------+--------- Term2 | 160 (1 rows) テーブルの削除 DBName=> drop table TableName; テーブルの内容をファイルに出力 (セパレータ=TAB(0x09), 改行=LF(0x0A)) DBName=> \copy TableName to CSV-PATH テーブルの内容をファイルに出力 (セパレータ=コンマ(,), 改行=LF(0x0A)) DBName=> \copy TableName to CSV-PATH using delimiters ',' テーブルの内容をファイルから追加 (セパレータ=TAB(0x09), 改行=LF(0x0A)) DBName=> \copy TableName from CSV-PATH ヘルプの表示 (コマンド) DBName=> \? DBName は何でも良い ヘルプの表示 (SQL 他) DBName=> \h DBName は何でも良い システムテーブルの表示 DBName=> \dS DBName は何でも良い ユーザの確認 DBName=> select * from pg_user ; DBName は何でも良い (pg_user は上記 \dS で表示されるもの) グループの確認 DBName=> select * from pg_group ; DBName は何でも良い (pg_group は上記 \dS で表示されるもの)
select を CSV で出力 (バッチモード) $ psql -F ',' -A -t -c 'select * from table'
バックアップ/リストア オンラインバックアップ (DB 単位) postgres$ pg_dump DBName > DBName.bup オンラインリストア (DB 単位) postgres$ createdb DBName postgres$ psql -e DBName < DBName.bup オンラインバックアップ (全 DB) postgres$ pg_dumpall > DBName.bup オンラインリストア (全 DB) postgres$ psql -e template1 < DBName.bup ※ pg_dumpall は、実際には pg_dump を呼び出すスクリプト ※ pg_dumpall はラージオブジェクトをバックアップが出来ない
アクセス権設定 DBName=> grant PermitList on TableName to User ; DBName=> revoke PermitList on TableName from User ; PermitList: select,insert,update,delete,rule,all User はユーザか public ※ public は一般ユーザの意味 アクセス権の確認 DBName=> \z Access permissions for database "DBName" Relation | Access permissions -----------+-------------------- TableName | {"=","foo=Permit"} (1 row) Permit: a insert r select w update/delete R rule ※ "=" は一般ユーザの意味 (右辺には何の権限もない)
PostgreSQLSQL92意味
charcharacter または char1バイト文字。マルチバイト文字は格納できない。1バイトを占有
char(n)character(n) または char(n)固定長文字列
4+n バイトを占有。
入力文字が指定桁に満たなければ空白文字で詰められる。
n は 4096 以下。
オーバー分は捨てられる。
varchar(n)character varying(n) または char varying(n) または varchar(n)可変長文字列
4+n バイトを占有
n は 4096 以下
オーバー分は捨てられる。
float4/8float(p)精度pの浮動小数点
float8double precision倍精度浮動小数点
float8real単精度浮動小数点
int4integer または int符号付き整数
int2smallint小桁符号付き整数
int4numeric(p,s)任意精度の 10 進数数値
int4decimal(p,s)任意精度の 10 進数数値
datedate年月日 '2001-01-01'
timetime (with timezone)時分秒 '20:30:10.555' (24 時間制)
timsetamptimestamp (with timezone)年月日時分秒
'1901-12-14 00:00:00' - '2038-01-19 23:59:59'
SQL92 とは実装が違う
timespaninterval時間間隔
PostgreSQLSQL3意味
boolbooleantrue/falseを示す
PostgreSQL意味使い方
box矩形左下と右上の点を指定
circle(x,y),<r> または x,y,r として指定
lseg直線[(x1,y1),(x2,y2)]
(x1,y1),(x2,y2)
x1,y1,x2,y2
(x1,y1,x2,y2)
のいずれか
path経路[(x1,y1),(x2,y2),..]
(x1,y1),(x2,y2),..
x1,y1,x2,y2,..
(x1,y1,x2,y2,..)
のいずれか
point(x,y)
x,y
のいずれか
polygon多角形(x1,y1),(x2,y2),..
x1,y1,x2,y2,..
(x1,y1,x2,y2,..)
のいずれか
text可変長テキストPostgreSQL では varchar では無く text を推奨
4+x バイトを占有
int88バイト整数contrib に添付。非サポートのプラットホームもある
datetime8バイト浮動小数点SQL92 の timestamp 型よりも高機能
timestamp型よりも広い範囲で精度が高い
・numeric,decimalは int4 で実装されているため、スケール s (少数部分の精度) は 0 のみ。  また、numeric と decimal は内部的に同一なので、精度 p も同じ。 ・SQL92 では、real は単精度浮動小数点と規定されているが、PostgreSQL では float8 として実装されている。 ・time with time zone は未サポート ・timestamp with time zone は未サポート 7.1.1 はサポート済み ・bit, bit varying は未サポート ・national character (nchar) は未サポート ・1レコードの大きさは 8192 バイト未満 (カラムの合計) ・8192 バイト超のデータは large object 型を使う ・配列から条件を特定して要素を検索することはできない  ※update myarray set ar = '{10,11,12}' where myarray.ar[1] = 1;   は可能。
・ラッパーからの呼び出し
#!/usr/local/bin/perl

use Pg ;

$conn = Pg::connectdb("dbname=DBName") ;
$rslt = $conn->exec("Query") ;

if ($rslt->resultStatus ne PGRES_TUPLES_OK)
	{
	print "execute fail: $conn->errorMessage\n" ;
	exit ;
	}

$n = $rslt->ntuples ;

for ( $i = 0 ; $i < $n ; $i ++ )
	{
	print $rslt->getvalue($i,N) ;
	print "\n" ;
	}
print "--- $n selected ---\n" ;
※psql ではDB名を指定しない場合、ユーザ名と同じDB名が使用されるが、  perl(Pg.pm) では DBName を明示しなくてはいけない。 ※Queryはセミコロンを付けない。(psql の SQL コマンドとは違う) ※NQueryの項目の番号。  例:   "select a,b from tableZ"   の場合、   $rslt->getvalue($i,0) --- a を取得   $rslt->getvalue($i,1) --- b を取得   になる。
・DBI からの呼び出し
#!/usr/local/bin/perl

use strict ;	# あったほうが良い
use DBI ;
my $dbh = DBI->connect("dbi:Pg:dbname=DBName", 'UserName', 'Password', {RaiseError=>1, PrintError=>1}) ;
my $sth ;
if (!($sth = $dbh->prepare('SQL'))) { die $dbh->errstr ; }
else
    {
    if (!($sth->execute())) { die $sth->errstr ; }
    else
        {
        while (my($t1,$t2) = $sth->fetchrow_array())
            {
            print "$t1,$t2\n" ;
            }
        if ($sth->err) { die $sth->errstr ; }
        }
    $sth->finish ;
    }
$dbh->disconnect ;
SQLは通常のSQL。最後の ';' は不要。(ここでは SELECT を想定しています)  項目の取出しに fetchrow_array() を使用しているので、SELECT 句の列指定順に気をつけること ※connect のフォーマットは  $dbh = DBI->connect("dbi:Pg:dbname=DBName;host=HostName;port=Port;options=Options;tty=tty", 'UserName', 'Password');
・Tie::DBI からの呼び出し
#!/usr/local/bin/perl

use strict ;            … あったほうが良い
use Tie::DBI () ;       … Tie::DBI モジュールがインストールされていること

tie my %DB, 'Tie::DBI', {
    'db'        => 'Pg:dbname=DBName',
    'table'     => 'TableName',
    'key'       => 'ColmnX',
    'user'      => 'UserName',    … オプション
    'password'  => 'Password',    … オプション
    } or die "couldn't open database" ;

foreach my $key (sort keys %DB)
    {
    print "$key : " ;
    print $DB{$key}->{'Colmn1'} . " " ;
    print $DB{$key}->{'Colmn2'} . " " ;
    …
    print $DB{$key}->{'ColmnN'} . " " ;
    print "\n" ;
    }

untie %DB ;

ODBC 接続 (MS-Access) その 1 PostgreSQL ODBC Driver 日本語版のページから psqlodbc.exe をダウンロード&実行する
PostgreSQL ODBC Driver 日本語版 ×

PostgreSQL ODBC Driver 07.01.0006 日本語版 2001/07/13 版をインストールしますか?


 
のダイアログボックスに はい(Y) を押せば完了。
ODBC 接続 (MS-Access) その 2 PostgreSQL のコンパイル ./Configure に --enable-odbc を付加する。 あとは普通にコンパイル&インストール。 ODBC ドライバのインストール (クライアント側) 1. psqlodbc-jp-20010713-bin.zip を解凍する。 2. psqlodbc.dll を C:\WINDOWS\SYSTEM\ にコピー。 3. psqlodbc.reg を実行 4. settings.reg を実行 5. [コントロールパネル] -> [ODBCデータソース(32ビット)] -> [ドライバタブ] に PostgreSQL があることを確認する ※このとき、まだ [ユーザーDSNタブ] には PostgreSQL が無い MS-Access での ODBC 指定 (クライアント側) 1. 適宜 DB を新規作成する ("Microsoft Access データベース" で良い) 2. [ファイル(F)] -> [外部データの取りこみ(D)] -> [テーブルのリンク(L)] から [ファイルの種類(T)] で "ODBCデータベース" を選択すると、「データソースの選択」が現れる 3. [コンピュータデータソースタブ] -> [新規作成] ボタンを押下すると 「データソースの新規作成」が現れる 4. "ユーザーデータソース (このコンピュータにのみ適用)(U)" を選択し [次へ(N)>] ボタンを押下 5. 「セットアップするデータソースのドライバを選択してください(S)」で "PostgreSQL" を選択して [次へ(N)] を押下 6. [完了] を押下すると「PostgreSQL Driver Setup」が現れるので、各項目に記入後 [OK] を押下 Data Source: PostgreSQL データソース名 (変更すること) Description: コメント (未記入でも可) Database: PostgreSQL の createdb で作成したデータベース名 Server: PostgreSQL のサーバ名 (IP アドレスでも可) Port: PostgreSQL のポート番号 (通常は 5432) User Name: PostgreSQL にログインするユーザ名 Password: PostgreSQL にログインするパスワード 7. 再び「データソースの選択」に戻り、6 で設定したデータソース (とコメント) が表示されるので選択し [OK] ボタンを押下 8. [コントロールパネル] -> [ODBCデータソース(32ビット)] -> [ユーザー DSN タブ] を見ると、データソースが追加されている
SQL を実行したとき、 NOTICE: Adding missing FROM-clause entry for table "TableName" のメッセージが出ることがあるが、これはエラーではありません。 「情報が足りないので TableName で補完した」 という意味のお知らせです。 SELECT src1.id FROM src1 WHERE src1.id = src2.id ; CREATE TABLE new_table AS SELECT src1.id FROM src1 WHERE src1.id = src2.id ; のような SQL を実行したとき出ます。 これを、 SELECT src1.id FROM src1,src2 WHERE src1.id = src2.id ; CREATE TABLE new_table AS SELECT src1.id FROM src1,src2 WHERE src1.id = src2.id ; とすれば出なくなります。