Guest User

Untitled

a guest
Nov 16th, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.91 KB | None | 0 0
  1. create or replace function fet_exemple()
  2. returns event_trigger AS
  3. $$
  4. declare
  5. l_obj record;
  6. l_rename character varying := '';
  7. l_col character varying := '';
  8. l_function_table character varying := '';
  9. l_function_view character varying := '';
  10. l_trigger_table character varying := '';
  11. l_trigger_view character varying := '';
  12. l_view character varying := '';
  13. l_view_select character varying := '';
  14. l_insert_columns character varying := '';
  15. l_insert_values character varying := '';
  16. l_update_columns_values character varying := '';
  17. l_table_schema character varying := '';
  18. l_table_name character varying := '';
  19. l_exemple_table_name character varying := '';
  20. l_ins_upd_new_column_string character varying := '';
  21.  
  22. /* Récupération des colonnes de la table en création */
  23. c1 cursor (c_exemple_table_name character varying) is
  24. (select column_name from information_schema.columns
  25. where table_name = c_exemple_table_name
  26. order by ordinal_position);
  27. begin
  28. /* Boucle sur le tableau des commandes DDL émises au travers de l'event trigger */
  29. for l_obj in select * from pg_event_trigger_ddl_commands()
  30. loop
  31. /* Détection de la création de la table */
  32. if l_obj.command_tag = 'CREATE TABLE' then
  33. l_table_name = substr(l_obj.object_identity,position('.' in l_obj.object_identity) + 1);
  34. l_exemple_table_name := 'exemple_' || l_table_name;
  35.  
  36. l_insert_columns := '(';
  37. l_insert_values := '(';
  38. /* Récupération de la liste des colonnes de la table pour créer :
  39. 1) Le select de la vue
  40. 2) la liste des colonnes pour l'insert
  41. 3) la liste des nouvelles valeurs pour l'insert
  42. 4) la liste des colonnes et nouvelles valeurs pour l'update
  43. et construction des morceaux de requêtes nécessaires pour le trigger des mises à jour
  44. */
  45. open c1(l_table_name);
  46. fetch c1 into l_col;
  47. while found
  48. loop
  49. l_ins_upd_new_column_string := l_ins_upd_new_column_string || 'new.'|| l_col || ' := ' || ''''|| '####' || '''' || ' || ' || 'new.'|| l_col || ';' || chr(10);
  50. l_view_select := l_view_select || 'substr(' || l_col || ',5)' || l_col || ',';
  51. l_insert_columns := l_insert_columns || l_col || ',';
  52. l_insert_values := l_insert_values || 'NEW.' || l_col || ',';
  53. l_update_columns_values := l_update_columns_values || l_col || ' = NEW.' || l_col || ',';
  54. fetch c1 into l_col;
  55. end loop;
  56. close c1;
  57. l_view_select := substr(l_view_select,1,length(l_view_select) - 1);
  58. l_insert_columns := substr(l_insert_columns,1,length(l_insert_columns) - 1) || ')';
  59. l_insert_values := substr(l_insert_values,1,length(l_insert_values) - 1) || ')';
  60. l_update_columns_values := substr(l_update_columns_values,1,length(l_update_columns_values) - 1);
  61.  
  62. /* Renommage de la table physique afin que la vue
  63. qui servira pour les accès à la table ait le nom de la table créée */
  64. l_rename := 'alter table ' || l_obj.object_identity || ' rename to ' || l_exemple_table_name;
  65. raise notice '%',l_rename;
  66. execute l_rename;
  67.  
  68. /* Récupération du nom du schéma de la table en cours de création */
  69. select table_schema into l_table_schema from information_schema.tables where table_name = l_exemple_table_name;
  70.  
  71. /* Création à la volée de la fonction trigger
  72. sur la table renommée pour les insertions et les mises à jour */
  73. l_function_table := 'create or replace function ' || l_table_schema || '.tf_' || l_exemple_table_name || '() returns trigger AS $TG$
  74. begin
  75. if tg_op = ''INSERT'' or tg_op = ''UPDATE'' then
  76. ' || l_ins_upd_new_column_string || '
  77. return new;
  78. end if;
  79. end; $TG$
  80. language plpgsql volatile
  81. cost 100;';
  82. raise notice '%',l_function_table;
  83. execute l_function_table;
  84.  
  85. /* Création du trigger sur la table renommée pour les insertions et mises à jour */
  86. l_trigger_table := 'create trigger tg_' || l_exemple_table_name || ' before insert or update on ' ||
  87. l_table_schema || '.' || l_exemple_table_name || ' for each row
  88. execute procedure ' || l_table_schema || '.tf_' || l_exemple_table_name || '();';
  89. raise notice '%',l_trigger_table;
  90. execute l_trigger_table;
  91.  
  92. /* Création de la vue permettant le traitement à la volée des
  93. select, insert, update, delete */
  94. l_view := 'create or replace view ' || l_table_schema || '.' || l_table_name || ' as select oid,' || l_view_select || ' from ' || l_exemple_table_name;
  95. raise notice '%',l_view;
  96. execute l_view;
  97.  
  98. /* Création de la fonction trigger qui traitera à la volée les insert, update et delete */
  99. l_function_view := 'create or replace function ' || l_table_schema || '.tf_' || l_table_name || '() returns trigger AS $FC$
  100. begin
  101. if tg_op = ''INSERT'' then
  102. insert into ' || l_exemple_table_name || l_insert_columns || ' values ' || l_insert_values || ';
  103. return new;
  104. end if;
  105. if tg_op = ''UPDATE'' then
  106. raise notice ''%'', ''update ' || l_exemple_table_name || ' set ' || l_update_columns_values || ' where oid = OLD.oid'';
  107. update ' || l_exemple_table_name || ' set ' || l_update_columns_values || ' where oid = OLD.oid;
  108. return new;
  109. end if;
  110. if tg_op = ''DELETE'' then
  111. delete from ' || l_exemple_table_name || ' where oid = OLD.oid;
  112. return new;
  113. end if;
  114. end; $FC$
  115. language plpgsql volatile
  116. cost 100;';
  117. raise notice '%',l_function_view;
  118. execute l_function_view;
  119.  
  120. /* Création du trigger sur la vue pour traitement des insert, update et delete */
  121. l_trigger_view := 'create trigger tg_' || l_table_name || ' instead of insert or update or delete on ' ||
  122. l_table_schema || '.' || l_table_name || ' for each row
  123. execute procedure ' || l_table_schema || '.tf_' || l_table_name || '();';
  124. raise notice '%',l_trigger_view;
  125. execute l_trigger_view;
  126.  
  127. end if;
  128. end loop;
  129. end;
  130. $$
  131. language plpgsql volatile
  132. cost 100;
  133.  
  134. /* Création de l'event trigger qui déclenchera la gestion globale
  135. de la création des fonctions triggers, des triggers et de la vue
  136. permettant le retraitement des données à la volée */
  137. drop event trigger et_exemple;
  138. create event trigger et_exemple
  139. on ddl_command_end
  140. execute function fet_exemple();
Add Comment
Please, Sign In to add comment