遇到了表格被 view 卡住無法刪掉的問題,要查是哪些下游卡住了這張表格、是否可以安全地處理掉。
正向表列
在這篇 Nathan Griffiths 在 Stack overflow 上的回答裏提到可以利用 pg_class 搭配 pg_get_viewdef 比較,來確認 view 有沒有使用 late-binding:
SELECT
pg_namespace.nspname AS schema_name,
pg_class.relname AS view_name,
pg_get_viewdef(pg_class.oid, true) as view_definition
FROM pg_class
LEFT JOIN pg_namespace
ON pg_class.relnamespace = pg_namespace.oid
WHERE
1 = 1
AND pg_class.relkind = 'v' :: CHAR
AND pg_get_viewdef(pg_class.oid, true) LIKE '%with no schema binding%';
利用的就是確認是否有出現 late-binding 的關鍵字 WITH NO SCHEMA BINDING
。
反向表列
回到遇到的問題,我想查看看哪些 view 把要處理的表格卡住了,目前我還沒找到直接對照的手段,但尚可把上面的查詢改為反向表列去做圈選:
...
AND pg_get_viewdef(pg_class.oid, true) NOT LIKE '%with no schema binding%';
這樣可以列舉出沒有做到 late-binding 的 view,然後搭配個表格名稱或是 schema 的名稱查詢大概能框出問題在哪裡。