私のデータベースには、標準のアプリケーションテーブルとバックアップテーブルがあります。例えば。テーブル "従業員"の場合、私は "bak_employee"というテーブルを持っています。 bak_employeeテーブルは、employeeテーブルのバックアップです。私はそれを使ってテスト間で従業員テーブルを復元します。PostgreSQL関数が動的テーブル名から結果セットを返す
私は、私はこのようなテスト中に発生した変更を確認するには、これらの「bak_」テーブルを使用することができます理解したい:これは私に挿入され、更新されたレコードを表示します
SELECT * FROM employee EXCEPT SELECT * FROM bak_employee
。私は今削除されたレコードを無視します。
ここで、データベース内のすべてのテーブルを調べて、テーブルに変更があるかどうかを確認します。私はこれを関数として行うことを考えていたので、何度も何度も繰り返し呼び出すことができます。これはこれまで私が持っているものです:
CREATE OR REPLACE FUNCTION public.show_diff()
RETURNS SETOF diff_tables AS
$BODY$
DECLARE
app_tables text;
BEGIN
FOR app_tables IN
SELECT table_name
FROM information_schema.tables
WHERE table_catalog = 'myDatabase'
AND table_schema = 'public'
AND table_name not like 'bak_%' -- exclude existing backup tables
LOOP
-- somehow loop through tables to see what's changed something like:
EXECUTE 'SELECT * FROM ' || app_tables || ' EXCEPT SELECT * FROM bak_' || app_tables;
END LOOP;
RETURN;
END;
$BODY$
LANGUAGE plpgsql;
しかし、明らかにこれは私に有用な情報を返しません。どんな助けもありがとう。
、しかし:: 'except'多型パラメータの型であなたにすべての違いを表示しません。 'select * from employee e full outer join bak_employee b on e.id = b.idのように、eはbとは別です 'のようなものが良いでしょう。 –
これは実際には「汎用」関数では実行できません。なぜなら、関数は1つの「物」しか返せないからです。しかし、これらのテーブルは異なる数の列を持ち、結果セットは** all **行に対して同じ数の列を持つ必要があります。動作させることができるのは、行のそれぞれをJSONドキュメントまたはキーとして変更された列を含む 'hstore'として返すことです。 –