在我的數據庫中,我有標準的應用程序表和備份表。例如。對於「員工」表,我有一個名爲「bak_employee」的表。 bak_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 where e is distinct from b' would be better。 –
這不能用「通用」函數完成,因爲該函數只能返回一個「事物」。但是這些表格將具有不同數量的列,並且結果集需要具有用於**所有**行的相同數量的列。可以工作的是將每個行作爲JSON文檔或包含修改列的'hstore'作爲關鍵字返回。 –