日々いろんな環境へ接続して作業をするので誤った環境での操作を予防のために使っています。DBへの接続後、ホスト名の取得ができないのがどうも不便と感じてしまい自作して使っています。(PostgreSQLの場合、接続先のIPアドレスは取得できますがなぜかホスト名は取得できないんですよね、、これがどうも不便と感じてしまいやむなく自作しました)
概要
┌─────────────┐
│ function │指定キーワードに対応する
┌─────┐ ├─────────────┤DBプロフィール値を返却する
│ table │<-- │current_profile(item_name)│
├─────┤ │ returns text │
│dbprofile │ └─────────────┘
│ │
│ │<-- ┌─────────────┐
│ │ │ function table │全てのDBプロフィール値を
└─────┘ ├─────────────┤返却する
│current_profiles() │
│ returns table │
└─────────────┘
プロフィール値保持テーブル(dbprofile)の作成用DDL
create table public.dbprofile ( item_physics_name text -- 項目物理名 , item_logical_name text -- 項目論理名 , item_value text -- 項目値 , note text -- 備考 , dispno integer -- 表示順 , last_updater text -- 最終更新者 , last_updating_time timestamp -- 最終更新日時 ) ; comment on table dbprofile is 'DBプロフィール'; comment on column dbprofile.item_physics_name is '項目物理名'; comment on column dbprofile.item_logical_name is '項目論理名'; comment on column dbprofile.item_value is '項目値'; comment on column dbprofile.note is '備考'; comment on column dbprofile.dispno is '表示順'; comment on column dbprofile.last_updater is '最終更新者'; comment on column dbprofile.last_updating_time is '最終更新日時'; alter table dbprofile alter column item_logical_name set not null; alter table dbprofile alter column item_value set not null; alter table dbprofile add constraint pk_dbprofile primary key ( item_logical_name ) ;
プロフィール値保持テーブル(dbprofile)の作成用DML
以下各自環境用に書き換えて使ってください。
insert into public.dbprofile(item_physics_name,item_logical_name,item_value,note,dispno,last_updater,last_updating_time) values('host_name','ホスト名','vm102','sooni用マシン',1,'sooni',current_timestamp); insert into public.dbprofile(item_physics_name,item_logical_name,item_value,note,dispno,last_updater,last_updating_time) values('system_name','システム名','スーニ―システム','',3,'sooni',current_timestamp); insert into public.dbprofile(item_physics_name,item_logical_name,item_value,note,dispno,last_updater,last_updating_time) values('system_startup_date','システム稼働開始日','2023/12','',5,'sooni',current_timestamp); insert into public.dbprofile(item_physics_name,item_logical_name,item_value,note,dispno,last_updater,last_updating_time) values('environment','稼働環境','開発環境','',2,'sooni',current_timestamp); insert into public.dbprofile(item_physics_name,item_logical_name,item_value,note,dispno,last_updater,last_updating_time) values('system_version','System Version','Ver.0.9','',4,'sooni',current_timestamp);
current_profile() 指定キーワードに対応するプロフィール値を取得
上記テーブル作成を行った同じユーザで作成する事想定しています。security definerとする事で上記テーブルへ直接アクセスできないユーザからも呼び出し可能になっています。
create or replace function public.current_profile(item_name text) returns text language 'plpgsql' security definer as $body$ declare vitem_value public.dbprofile.item_value%type = null; begin select item_value into vitem_value from public.dbprofile where lower(item_physics_name) = lower(item_name); return vitem_value; end; $body$;
current_profiles () 全てのDBプロフィール値を全て取得
create or replace function public.current_profiles () returns table ( item_physics_name text, item_logical_name text, item_value text ) language plpgsql security definer as $body$ begin return query select t.item_physics_name,t.item_logical_name,t.item_value from public.dbprofile t order by dispno; end; $body$;
接続先プロフィール情報出力(個別)
select public.current_profile('host_name');
接続先プロフィール情報出力(全件)
select * from public.current_profiles();
実行例
esdb=# select public.current_profile('host_name');
current_profile
-----------------
e-search-dev
(1 行)
esdb=# select * from public.current_profiles();
item_physics_name | item_logical_name | item_value
---------------------+--------------------+--------------
host_name | ホスト名 | e-search-dev
environment | 稼働環境 | 開発環境
system_name | システム名 | e-search
system_version | System Version | Ver.0..9
system_startup_date | システム稼働開始日 | 2023/12
(5 行)
esdb=#