デフォルトで新しいスキーマを作成するスキーマを定義することはできますか? (「非修飾テーブル名」によって参照されます。)
Postgresでの「検索パス」の使用に関する詳細を見てきましたが、作成ではなくデータの取得中にのみ機能すると思います。
多くのテーブルを作成するSQLスクリプトがたくさんあります。スクリプトを変更する代わりに、デフォルトでは特定のスキーマ内にデータベース作成テーブルを設定します-非修飾名がある場合。
これは可能ですか?
検索パスはまさにあなたが望むものです:
% create schema blarg;
% set search_path to blarg;
% create table foo (id int);
% \d
List of relations
Schema | Name | Type | Owner
--------+------+-------+-------
blarg | foo | table | pgsql
[...]テーブルは多くの場合、テーブル名のみで構成される非修飾名で参照されます。システムは、調べるスキーマのリストである検索パスをたどることにより、どのテーブルを意味するかを決定します。
大胆な強調鉱山。これは識別子解決を説明し、“現在のスキーマ”は、ドキュメントごとに :
検索パスで指定された最初のスキーマは、現在のスキーマと呼ばれます。最初に検索されるスキーマであることに加えて、
CREATE TABLE
コマンドでスキーマ名が指定されていない場合、新しいテーブルが作成されるスキーマでもあります。
大胆な強調鉱山。システムスキーマpg_temp
(現在のセッションの一時オブジェクトのスキーマ)およびpg_catalog
は、自動的に検索パスの一部であり、検索されます最初の、この順序で。 ドキュメントごと:
pg_catalog
は常に事実上検索パスの一部です。パスで明示的に名前が付けられていない場合は、パスのスキーマを検索するbeforeが暗黙的に検索されます。これにより、組み込みの名前が常に検索可能になります。ただし、組み込みの名前をユーザー定義の名前で上書きしたい場合は、pg_catalog
を検索パスの末尾に明示的に配置できます。
オリジナルごとの大胆な強調。そして、pg_temp
は、別の位置に置かれない限り、その前に来ます。
ランタイム変数 search_path
を実際に設定するためのさまざまなオプションがあります。
postgresql.conf
のすべてのデータベースのすべてのロールにcluster- wideデフォルトを設定します(および再読み込み)。それに注意してください!
search_path = 'blarg,public'
この設定の shippedデフォルト は次のとおりです。
search_path = "$user",public
最初の要素は、現在のユーザーと同じ名前のスキーマを検索することを指定します。そのようなスキーマが存在しない場合、エントリは無視されます。
1つのdatabaseのデフォルトとして設定します:
ALTER DATABASE test SET search_path = blarg,public;
接続するroleのデフォルトとして設定します(クラスター全体で有効):
ALTER ROLE foo SET search_path = blarg,public;
または指定されたデータベースのロールのみのデフォルトとして(多くの場合最高!):
ALTER ROLE foo IN DATABASE test SET search_path = blarg,public;
スクリプトの先頭にコマンドを記述します(またはsessionの任意の時点でコマンドを実行します:
SET search_path = blarg,public;
関数のスコープに特定のsearch_path
を設定します(十分な特権を持つ悪意のあるユーザーから保護するため)。マニュアルの _SECURITY DEFINER
関数の安全な作成 について読んでください。
CREATE FUNCTION foo() RETURNS void AS
$func$
BEGIN
-- do stuff
END
$func$ LANGUAGE plpgsql SECURITY DEFINER
SET search_path=blarg,public,pg_temp;
私のリストの数字が大きいほど数字は小さくなります。
マニュアルには、環境変数の設定やコマンドラインオプションの使用など、さらに多くの方法 があります。
現在の設定を確認するには:
SHOW search_path;
reset it:
RESET search_path;
ドキュメントごと :
デフォルト値は、現在のセッションで
SET
が発行されていなかった場合にパラメーターが持っていた値として定義されます。