schema-evolution-manager 0.9.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,64 @@
1
+ -- This script initializes the schema_evolution_manager schema and the scripts and
2
+ -- the bootstrap_scripts tables
3
+
4
+ create schema schema_evolution_manager;
5
+
6
+ SET search_path TO schema_evolution_manager;
7
+
8
+ create or replace function table_exists(p_schema_name character varying, p_table_name character varying) returns boolean
9
+ language plpgsql
10
+ as $$
11
+ begin
12
+ perform 1 from information_schema.tables where table_schema = p_schema_name and table_name=p_table_name and table_type='BASE TABLE';
13
+ return found;
14
+ end;
15
+ $$;
16
+
17
+ create or replace function create_tables() returns void
18
+ language plpgsql
19
+ as $$
20
+ begin
21
+ if not table_exists('schema_evolution_manager', 'scripts') then
22
+
23
+ create table schema_evolution_manager.scripts (
24
+ id bigserial,
25
+ filename varchar(100) not null,
26
+ created_at timestamp with time zone default now() not null
27
+ );
28
+
29
+ alter table schema_evolution_manager.scripts add constraint scripts_id_pk primary key(id);
30
+ alter table schema_evolution_manager.scripts add constraint scripts_filename_un unique(filename);
31
+
32
+ comment on table schema_evolution_manager.scripts is '
33
+ When a script is applied to this database, the script is recorded
34
+ here. This table is the used to ensure scripts are applied at most
35
+ once to this database.
36
+ ';
37
+
38
+ end if;
39
+
40
+ if not table_exists('schema_evolution_manager', 'bootstrap_scripts') then
41
+
42
+ create table schema_evolution_manager.bootstrap_scripts (
43
+ id bigserial,
44
+ filename varchar(100) not null,
45
+ created_at timestamp with time zone default now() not null
46
+ );
47
+
48
+ alter table schema_evolution_manager.bootstrap_scripts add constraint bootstrap_scripts_id_pk primary key(id);
49
+ alter table schema_evolution_manager.bootstrap_scripts add constraint bootstrap_scripts_filename_un unique(filename);
50
+
51
+ comment on table schema_evolution_manager.bootstrap_scripts is '
52
+ Internal list of schema_evolution_manager sql scripts applied. Used only for upgrades
53
+ to schema_evolution_manager itself.
54
+ ';
55
+
56
+ end if;
57
+
58
+ end;
59
+ $$;
60
+
61
+ select create_tables();
62
+
63
+ drop function create_tables();
64
+ drop function table_exists(character varying, character varying);
@@ -0,0 +1,135 @@
1
+ -- library of common utility functions
2
+ set search_path to schema_evolution_manager;
3
+
4
+ CREATE OR REPLACE FUNCTION create_basic_audit_data(p_schema_name character varying, p_table_name character varying) RETURNS void
5
+ LANGUAGE plpgsql
6
+ AS $$
7
+ begin
8
+ perform schema_evolution_manager.create_basic_created_audit_data(p_schema_name, p_table_name);
9
+ perform schema_evolution_manager.create_basic_updated_audit_data(p_schema_name, p_table_name);
10
+ perform schema_evolution_manager.create_basic_deleted_audit_data(p_schema_name, p_table_name);
11
+ end;
12
+ $$;
13
+
14
+ CREATE OR REPLACE FUNCTION create_basic_created_audit_data(p_schema_name character varying, p_table_name character varying) RETURNS void
15
+ LANGUAGE plpgsql
16
+ AS $$
17
+ begin
18
+ execute 'alter table ' || p_schema_name || '.' || p_table_name || ' add created_by_guid uuid not null';
19
+ execute 'alter table ' || p_schema_name || '.' || p_table_name || ' add created_at timestamp with time zone default now() not null';
20
+ end;
21
+ $$;
22
+
23
+ CREATE OR REPLACE FUNCTION create_basic_deleted_audit_data(p_schema_name character varying, p_table_name character varying) RETURNS void
24
+ LANGUAGE plpgsql
25
+ AS $$
26
+ begin
27
+ execute 'alter table ' || p_schema_name || '.' || p_table_name || ' add deleted_by_guid uuid';
28
+ execute 'alter table ' || p_schema_name || '.' || p_table_name || ' add deleted_at timestamp with time zone';
29
+ execute 'alter table ' || p_schema_name || '.' || p_table_name || ' add constraint ' || p_table_name || '_deleted_ck ' ||
30
+ 'check ( (deleted_at is null and deleted_by_guid is null) OR (deleted_at is not null and deleted_by_guid is not null) )';
31
+ perform schema_evolution_manager.create_prevent_immediate_delete_trigger(p_schema_name, p_table_name);
32
+ end;
33
+ $$;
34
+
35
+ CREATE OR REPLACE FUNCTION create_basic_updated_audit_data(p_schema_name character varying, p_table_name character varying) RETURNS void
36
+ LANGUAGE plpgsql
37
+ AS $$
38
+ begin
39
+ execute 'alter table ' || p_schema_name || '.' || p_table_name || ' add updated_by_guid uuid not null';
40
+ execute 'alter table ' || p_schema_name || '.' || p_table_name || ' add updated_at timestamp with time zone default now() not null';
41
+ perform schema_evolution_manager.create_updated_at_trigger(p_schema_name, p_table_name);
42
+ end;
43
+ $$;
44
+
45
+ CREATE OR REPLACE FUNCTION prevent_delete() RETURNS trigger
46
+ LANGUAGE plpgsql
47
+ AS $$
48
+ begin
49
+ raise exception 'Physical deletes are not allowed on this table';
50
+ end;
51
+ $$;
52
+
53
+ CREATE OR REPLACE FUNCTION prevent_immediate_delete() RETURNS trigger
54
+ LANGUAGE plpgsql
55
+ AS $$
56
+ begin
57
+ if old.deleted_at is null then
58
+ raise exception 'You must set the deleted_at column for this table';
59
+ end if;
60
+
61
+ if old.deleted_at > now() - interval '1 months' then
62
+ raise exception 'Physical deletes on this table can occur only after 1 month of deleting the records';
63
+ end if;
64
+
65
+ return old;
66
+ end;
67
+ $$;
68
+
69
+ CREATE OR REPLACE FUNCTION create_updated_at_trigger(p_schema_name character varying, p_table_name character varying) RETURNS character varying
70
+ LANGUAGE plpgsql
71
+ AS $$
72
+ declare
73
+ v_name varchar;
74
+ begin
75
+ v_name = p_table_name || '_updated_at_trigger';
76
+ execute 'drop trigger if exists ' || v_name || ' on ' || p_schema_name || '.' || p_table_name;
77
+ execute 'create trigger ' || v_name || ' before update on ' || p_schema_name || '.' || p_table_name || ' for each row execute procedure schema_evolution_manager.set_updated_at_trigger_function()';
78
+ return v_name;
79
+ end;
80
+ $$;
81
+
82
+ CREATE OR REPLACE FUNCTION set_updated_at_trigger_function() RETURNS trigger
83
+ LANGUAGE plpgsql
84
+ AS $$
85
+ begin
86
+ if (new.updated_at = old.updated_at) then
87
+ new.updated_at = timezone('utc', now())::timestamptz;
88
+ end if;
89
+ return new;
90
+ end;
91
+ $$;
92
+
93
+ CREATE OR REPLACE FUNCTION create_prevent_immediate_delete_trigger(p_schema_name character varying, p_table_name character varying) RETURNS character varying
94
+ LANGUAGE plpgsql
95
+ AS $$
96
+ declare
97
+ v_name varchar;
98
+ begin
99
+ v_name = p_table_name || '_prevent_immediate_delete_trigger';
100
+ execute 'create trigger ' || v_name || ' before delete on ' || p_schema_name || '.' || p_table_name || ' for each row execute procedure schema_evolution_manager.prevent_immediate_delete()';
101
+ return v_name;
102
+ end;
103
+ $$;
104
+
105
+ CREATE OR REPLACE FUNCTION create_prevent_update_trigger(p_schema_name character varying, p_table_name character varying) RETURNS character varying
106
+ LANGUAGE plpgsql
107
+ AS $$
108
+ declare
109
+ v_name varchar;
110
+ begin
111
+ v_name = p_table_name || '_prevent_update_trigger';
112
+ execute 'create trigger ' || v_name || ' after update on ' || p_schema_name || '.' || p_table_name || ' for each row execute procedure schema_evolution_manager.prevent_update()';
113
+ return v_name;
114
+ end;
115
+ $$;
116
+
117
+ CREATE OR REPLACE FUNCTION create_prevent_delete_trigger(p_schema_name character varying, p_table_name character varying) RETURNS character varying
118
+ LANGUAGE plpgsql
119
+ AS $$
120
+ declare
121
+ v_name varchar;
122
+ begin
123
+ v_name = p_table_name || '_prevent_delete_trigger';
124
+ execute 'create trigger ' || v_name || ' after delete on ' || p_schema_name || '.' || p_table_name || ' for each row execute procedure schema_evolution_manager.prevent_delete()';
125
+ return v_name;
126
+ end;
127
+ $$;
128
+
129
+ CREATE OR REPLACE FUNCTION prevent_update() RETURNS trigger
130
+ LANGUAGE plpgsql
131
+ AS $$
132
+ begin
133
+ raise exception 'Physical updates are not allowed on this table';
134
+ end;
135
+ $$;
@@ -0,0 +1,28 @@
1
+ To add a new database migration script:
2
+
3
+ 1. Make sure you have head of master:
4
+ git checkout master
5
+ git fetch
6
+ git rebase origin/master
7
+
8
+ 2. Create a local branch for your change
9
+ git checkout -b tmp
10
+
11
+ 3. Create a file containing your upgrade script - e.g. new.sql
12
+
13
+ 4. Add your upgrade script
14
+ %%add_script_path%% ./new.sql
15
+ git commit -m 'Add upgrade script to ...' scripts
16
+
17
+ 5. Push change
18
+
19
+ To upgrade your local postgresql database:
20
+
21
+ sem-apply --host localhost --name sample --user postgres
22
+
23
+ or use the wrapper script:
24
+
25
+ ./dev.rb
26
+
27
+ For more information on the schema evolution manager tools, look at
28
+ schema-evolution-manager/README.md
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+ # == Wrapper script to update a local postgrseql database
3
+ #
4
+ # == Usage
5
+ # ./dev.rb
6
+ #
7
+
8
+ Dir.chdir(File.dirname($0)) {
9
+ command = "sem-apply --url %%url%%"
10
+ puts command
11
+ exec(command)
12
+ }
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: schema-evolution-manager
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.24
5
+ platform: ruby
6
+ authors:
7
+ - Michael Bryzek
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-02-28 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: '["Michael Bryzek"]'
14
+ email: mbryzek@alum.mit.edu
15
+ executables:
16
+ - sem-add
17
+ - sem-apply
18
+ - sem-baseline
19
+ - sem-config
20
+ - sem-dist
21
+ - sem-info
22
+ - sem-init
23
+ extensions: []
24
+ extra_rdoc_files: []
25
+ files:
26
+ - README.md
27
+ - bin/sem-add
28
+ - bin/sem-apply
29
+ - bin/sem-baseline
30
+ - bin/sem-config
31
+ - bin/sem-dist
32
+ - bin/sem-info
33
+ - bin/sem-init
34
+ - lib/schema-evolution-manager/apply_util.rb
35
+ - lib/schema-evolution-manager/args.rb
36
+ - lib/schema-evolution-manager/ask.rb
37
+ - lib/schema-evolution-manager/baseline_util.rb
38
+ - lib/schema-evolution-manager/db.rb
39
+ - lib/schema-evolution-manager/install_template.rb
40
+ - lib/schema-evolution-manager/library.rb
41
+ - lib/schema-evolution-manager/migration_file.rb
42
+ - lib/schema-evolution-manager/preconditions.rb
43
+ - lib/schema-evolution-manager/rdoc_usage.rb
44
+ - lib/schema-evolution-manager/script_error.rb
45
+ - lib/schema-evolution-manager/scripts.rb
46
+ - lib/schema-evolution-manager/sem_info.rb
47
+ - lib/schema-evolution-manager/sem_version.rb
48
+ - lib/schema-evolution-manager/template.rb
49
+ - lib/schema-evolution-manager/version.rb
50
+ - lib/schema-evolution-manager.rb
51
+ - scripts/20130318-105434.sql
52
+ - scripts/20130318-105456.sql
53
+ - template/dev.rb
54
+ - template/README.md
55
+ homepage: https://github.com/gilt/schema-evolution-manager
56
+ licenses:
57
+ - Apache 2.0
58
+ metadata: {}
59
+ post_install_message:
60
+ rdoc_options: []
61
+ require_paths:
62
+ - lib
63
+ required_ruby_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - '>='
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ required_rubygems_version: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - '>='
71
+ - !ruby/object:Gem::Version
72
+ version: '0'
73
+ requirements: []
74
+ rubyforge_project:
75
+ rubygems_version: 2.0.14
76
+ signing_key:
77
+ specification_version: 4
78
+ summary: Schema evolution manager is a simple schema migration tool for postgresql
79
+ databases.
80
+ test_files: []