Advertisement
Guest User

Untitled

a guest
Aug 1st, 2015
252
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.34 KB | None | 0 0
  1. create table deps_saved_ddl
  2. (
  3. deps_id serial primary key,
  4. deps_view_schema varchar(255),
  5. deps_view_name varchar(255),
  6. deps_ddl_to_run text
  7. );
  8.  
  9. create or replace function deps_save_and_drop_dependencies(p_view_schema varchar, p_view_name varchar) returns void as
  10. $$
  11. declare
  12. v_curr record;
  13. begin
  14. for v_curr in
  15. (
  16. select obj_schema, obj_name, obj_type from
  17. (
  18. with recursive recursive_deps(obj_schema, obj_name, obj_type, depth) as
  19. (
  20. select p_view_schema, p_view_name, null::varchar, 0
  21. union
  22. select dep_schema::varchar, dep_name::varchar, dep_type::varchar, recursive_deps.depth + 1 from
  23. (
  24. select ref_nsp.nspname ref_schema, ref_cl.relname ref_name,
  25. rwr_cl.relkind dep_type,
  26. rwr_nsp.nspname dep_schema,
  27. rwr_cl.relname dep_name
  28. from pg_depend dep
  29. join pg_class ref_cl on dep.refobjid = ref_cl.oid
  30. join pg_namespace ref_nsp on ref_cl.relnamespace = ref_nsp.oid
  31. join pg_rewrite rwr on dep.objid = rwr.oid
  32. join pg_class rwr_cl on rwr.ev_class = rwr_cl.oid
  33. join pg_namespace rwr_nsp on rwr_cl.relnamespace = rwr_nsp.oid
  34. where dep.deptype = 'n'
  35. and dep.classid = 'pg_rewrite'::regclass
  36. ) deps
  37. join recursive_deps on deps.ref_schema = recursive_deps.obj_schema and deps.ref_name = recursive_deps.obj_name
  38. where (deps.ref_schema != deps.dep_schema or deps.ref_name != deps.dep_name)
  39. )
  40. select obj_schema, obj_name, obj_type, depth
  41. from recursive_deps
  42. where depth > 0
  43. ) t
  44. group by obj_schema, obj_name, obj_type
  45. order by max(depth) desc
  46. ) loop
  47.  
  48. insert into deps_saved_ddl(deps_view_schema, deps_view_name, deps_ddl_to_run)
  49. select p_view_schema, p_view_name, 'COMMENT ON ' ||
  50. case
  51. when c.relkind = 'v' then 'VIEW'
  52. when c.relkind = 'm' then 'MATERIALIZED VIEW'
  53. else ''
  54. end
  55. || ' ' || n.nspname || '.' || c.relname || ' IS ''' || replace(d.description, '''', '''''') || ''';'
  56. from pg_class c
  57. join pg_namespace n on n.oid = c.relnamespace
  58. join pg_description d on d.objoid = c.oid and d.objsubid = 0
  59. where n.nspname = v_curr.obj_schema and c.relname = v_curr.obj_name and d.description is not null;
  60.  
  61. insert into deps_saved_ddl(deps_view_schema, deps_view_name, deps_ddl_to_run)
  62. select p_view_schema, p_view_name, 'COMMENT ON COLUMN ' || n.nspname || '.' || c.relname || '.' || a.attname || ' IS ''' || replace(d.description, '''', '''''') || ''';'
  63. from pg_class c
  64. join pg_attribute a on c.oid = a.attrelid
  65. join pg_namespace n on n.oid = c.relnamespace
  66. join pg_description d on d.objoid = c.oid and d.objsubid = a.attnum
  67. where n.nspname = v_curr.obj_schema and c.relname = v_curr.obj_name and d.description is not null;
  68.  
  69. insert into deps_saved_ddl(deps_view_schema, deps_view_name, deps_ddl_to_run)
  70. select p_view_schema, p_view_name, 'GRANT ' || privilege_type || ' ON ' || table_schema || '.' || table_name || ' TO ' || grantee
  71. from information_schema.role_table_grants
  72. where table_schema = v_curr.obj_schema and table_name = v_curr.obj_name;
  73.  
  74. if v_curr.obj_type = 'v' then
  75. insert into deps_saved_ddl(deps_view_schema, deps_view_name, deps_ddl_to_run)
  76. select p_view_schema, p_view_name, 'CREATE VIEW ' || v_curr.obj_schema || '.' || v_curr.obj_name || ' AS ' || view_definition
  77. from information_schema.views
  78. where table_schema = v_curr.obj_schema and table_name = v_curr.obj_name;
  79. elsif v_curr.obj_type = 'm' then
  80. insert into deps_saved_ddl(deps_view_schema, deps_view_name, deps_ddl_to_run)
  81. select p_view_schema, p_view_name, 'CREATE MATERIALIZED VIEW ' || v_curr.obj_schema || '.' || v_curr.obj_name || ' AS ' || definition
  82. from pg_matviews
  83. where schemaname = v_curr.obj_schema and matviewname = v_curr.obj_name;
  84. end if;
  85.  
  86. execute 'DROP ' ||
  87. case
  88. when v_curr.obj_type = 'v' then 'VIEW'
  89. when v_curr.obj_type = 'm' then 'MATERIALIZED VIEW'
  90. end
  91. || ' ' || v_curr.obj_schema || '.' || v_curr.obj_name;
  92.  
  93. end loop;
  94. end;
  95. $$
  96. LANGUAGE plpgsql;
  97.  
  98. create or replace function deps_restore_dependencies(p_view_schema varchar, p_view_name varchar) returns void as
  99. $$
  100. declare
  101. v_curr record;
  102. begin
  103. for v_curr in
  104. (
  105. select deps_ddl_to_run
  106. from deps_saved_ddl
  107. where deps_view_schema = p_view_schema and deps_view_name = p_view_name
  108. order by deps_id desc
  109. ) loop
  110. execute v_curr.deps_ddl_to_run;
  111. end loop;
  112. delete from deps_saved_ddl
  113. where deps_view_schema = p_view_schema and deps_view_name = p_view_name;
  114. end;
  115. $$
  116. LANGUAGE plpgsql;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement