最近我需要將對象從PostgreSQL的默認模式「public」移動到另一個模式。如果發現this後顯示如何移動表是偉大的,但我也需要移動的功能。在一個操作中更改多個PostgreSQL函數的模式?
1
A
回答
1
你可以細化環路一些(展示只有第二個查詢):
DO
$do$
DECLARE
r record;
sql text = '';
BEGIN
FOR r IN
SELECT p.proname, pg_get_function_identity_arguments(p.oid) AS params
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE nspname = 'public'
-- and other conditions, if needed
LOOP
sql := sql
|| format(E'\nALTER FUNCTION public.%I(%s) SET SCHEMA new_schema;'
,r.proname, r.params);
END LOOP;
RAISE NOTICE '%', sql; -- for viewing the sql before executing it
-- EXECUTE sql; -- for executing the sql
END
$do$;
要點
賦值運算符在PLPGSQL是
:=
。=
工程,但沒有記錄。從
FROM
中刪除不需要的表格。concat()
可能是矯枉過正,但format()
簡化了語法。
更好組爲基礎的替代
重新鑄造的問題,因爲基於集的操作更有效。一個選擇與string_agg()
做這項工作:
DO
$do$
DECLARE
sql text;
BEGIN
SELECT INTO sql
string_agg(format('ALTER FUNCTION public.%I(%s) SET SCHEMA new_schema;'
,p.proname, pg_get_function_identity_arguments(p.oid)), E'\n')
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE nspname = 'public';
-- and other conditions, if needed
RAISE NOTICE '%', sql; -- for viewing the sql before executing it
-- EXECUTE sql; -- for executing the sql
END
$do$;
0
DO$$
DECLARE
row record;
BEGIN
FOR row IN SELECT tablename FROM pg_tables WHERE schemaname = 'public' -- and other conditions, if needed
LOOP
EXECUTE 'ALTER TABLE public.' || quote_ident(row.tablename) || ' SET SCHEMA [new_schema];';
END LOOP;
END;
$$;
DO$$
DECLARE
row record;
sql text = E'\n';
BEGIN
FOR row IN
SELECT
proname::text as proname,
pg_get_function_identity_arguments(p.oid) AS params
FROM pg_proc p
JOIN pg_namespace n on n.oid = p.pronamespace
WHERE nspname = 'public'
-- and other conditions, if needed
LOOP
sql = CONCAT(sql, E'\n',
'ALTER FUNCTION public.', row.proname,
'(', row.params, ') SET SCHEMA [new_schema];');
END LOOP;
RAISE NOTICE '%', sql; -- for viewing the sql before executing it
-- EXECUTE sql; -- for executing the sql
END;$$;
+0
我認爲這是做到這一點的最好方法。如果別人有更好的方法,我會很高興將其標記爲答案。 –
相關問題
- 1. 如何在一個操作中更改多個PostgreSQL表的模式?
- 2. JavaFX在一個操作中更改多個按鈕的文本
- 3. 在一個操作中更改多個ASP.NET控件的屬性
- 4. 在多個函數文件中設置操作模式的優雅方式
- 5. 多個plyr函數和操作在一個語句中?
- 6. Postgresql一個數據庫與多個模式與多個數據庫與一個模式
- 7. Postgresql從一個主數據庫更新多個數據庫模式
- 8. postgresql在多個模式下的請求
- 9. 在heroku上的一個數據庫中創建多個模式postgresql
- 10. 在postgreSQL函數中執行多個更新命令的問題
- 11. Java字符串操作,更改多個斜線一個斜線
- 12. 一個具有多個操作的UIAlertController函數 - 這可能嗎?
- 13. Postgresql:更改外鍵約束的操作
- 14. 更改一個jquery函數
- 15. CakePHP在同一個控制器中操作多個模型
- 16. 模擬多用戶操作Python的PostgreSQL?
- 17. pyspark:在一個映射函數中多個操作的語法錯誤
- 18. 一次執行多個修改操作
- 19. 在一個lambda表達式中執行多個賦值操作
- 20. 火星地圖操作更改模式
- 21. 我的第一個PostgreSQL模式 - 如何處理多個付款
- 22. ArchiCAD GDL在一次操作中多次更改停止參數
- 23. PHP模型:一個或多個setter通過數據庫操作?
- 24. 在matlab中爲一個類重載每個函數操作符
- 25. 如何在CodeIgniter的多個模型中組織一組操作?
- 26. 多個構造函數的JavaScript模式
- 27. 在一個postgresql中合併多個表
- 28. 迭代對象操作或一次更改多個對象
- 29. PostgreSQL:創建一個接受多個值的函數
- 30. Postgresql一個表的多個計數
糟糕,我忘記從該查詢的另一個應用程序中刪除那些無關的聯接。格式化函數的寫法看起來更好。我將從現在開始使用它。將'string_agg'放入'sql'變量的奇妙想法。謝謝Erwin –
順便說一句,+1提及使用的東西,但沒有記錄 - 這是最好的文件化的方式。 –