Cobolデータ(インデックスファイル)をデータベースに転送するプログラムがあります。
これまでは、データをOracleデータベースに転送していました。
プログラムの最初に、ユーザーsys
でログインし、現在のスキーマをink
に変更しました。 ink
にはテーブルを作成する権限がないため、この方法でこれを行いました。
次に、テーブルを作成し、テーブルの所有者は自動的にink
ではなくsys
になりました。
最近、データベースをOracleからPostgresに切り替えました。
ここでは「postgres」としてログインし、次のコマンドで「ink」スキーマに切り替えます。
set search_path to 'ink';
次に、テーブルを作成します。テーブルの所有者は、postgres
ではなくink
になります。したがって、この動作は逆になります。
Oracleデータベースと同じ動作をするために何をしなければなりませんか:
私のシナリオでは、テーブルの所有者は自動的にink
ではなくpostgres
になるはずです。
書く必要がないといいですね
ALTER TABLE ... OWNER TO ink;
各create tableコマンドの後。
Oracleでは、スキーマとユーザーは同じものです。 Postgresではそうではありません。
したがって、「Postgresランド」でOracleで行った操作を直接「マッピング」することはできません。テーブルはalwaysであり、最初にそれを作成したユーザーが所有しています。これを変更する方法はありません。
ユーザーにink
にテーブルを作成する権限を与えたくない場合、「Postgres」の方法は、そのユーザーにテーブルに対するすべての権限を与えることです。 Oracleとは異なり、スキーマで作成されたオブジェクトに対してdefault特権を確立できます。各テーブルを作成した後で、それらを付与することを覚えておく必要はありません。
create schema ink;
grant usage on schema ink to ink;
alter default privileges
in schema ink
grant all privileges on tables to ink;
その後に作成されたすべてのテーブルには、定義された権限が自動的に付与されます。つまり、ink
は、そのユーザーが所有者ではないため、ドロップ以外のすべての操作を実行できます。これはOracleソリューションとは異なります。
警告される:私はPostgreSQLに比較的慣れていないので、これが良い習慣であるかどうかはわかりませんが...
これに対処できると私が考える1つの方法は、次のように、データベース内のすべてのオブジェクトを作成したプロセスの最後にREASSIGN OWNED
ステートメントを実行することです。
REASSIGN OWNED BY CURRENT_USER TO ink;
このようにすると、テーブルがpostgres
ユーザーによって一時的に所有されている場合でも、作成プロセスが終了すると、それらはink
によって所有されていることがわかります。
ink
にデータベース内にテーブルを作成する権限を与え、ink
としてデータベースに接続します。次に、そこに作成するすべてのテーブルはink
が所有します。
PostgreSQLはこれに対してOracleとは異なるアプローチをとっています。スキーマと所有者は2つの異なる「もの」です。