3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
# File 'lib/pgtrigger/active_record/migration.rb', line 3
def create_trigger(table_name, trigger_name, after: nil, before: nil, declare: nil)
raise "Not defined after or before for create_trigger" unless after || before
raise "Define only on after or before" if after && before
trigger_name = Pgtrigger::Utils.build_trigger_name(table_name, trigger_name)
if declare
declare = "DECLARE \n\t\t#{declare.map{|var| var.to_a.join(" ")}.join(";\n\t\t")};"
end
execute(" CREATE OR REPLACE FUNCTION \#{trigger_name}_func()\n RETURNS trigger\n LANGUAGE plpgsql\n AS $function$\n \#{declare}\n BEGIN\n \#{yield}\n END;\n $function$\n TRIGGERSQL\n )\n\n after = after.join(\" OR \") if [\"Array\"].include?(after.class.to_s)\n after = \"AFTER \#{after}\" if after\n\n before = before.join(\" OR \") if [\"Array\"].include?(before.class.to_s)\n before = \"BEFORE \#{before}\" if before\n\n execute(<<-TRIGGERSQL\n CREATE TRIGGER \#{trigger_name}_trigger\n \#{after} \#{before} ON \#{table_name}\n FOR EACH ROW EXECUTE PROCEDURE \#{trigger_name}_func()\n TRIGGERSQL\n )\nend\n"
|