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.
- checksums.yaml +7 -0
- data/README.md +334 -0
- data/bin/sem-add +46 -0
- data/bin/sem-apply +41 -0
- data/bin/sem-baseline +34 -0
- data/bin/sem-config +1 -0
- data/bin/sem-dist +92 -0
- data/bin/sem-info +43 -0
- data/bin/sem-init +95 -0
- data/lib/schema-evolution-manager.rb +26 -0
- data/lib/schema-evolution-manager/apply_util.rb +60 -0
- data/lib/schema-evolution-manager/args.rb +159 -0
- data/lib/schema-evolution-manager/ask.rb +44 -0
- data/lib/schema-evolution-manager/baseline_util.rb +50 -0
- data/lib/schema-evolution-manager/db.rb +104 -0
- data/lib/schema-evolution-manager/install_template.rb +118 -0
- data/lib/schema-evolution-manager/library.rb +176 -0
- data/lib/schema-evolution-manager/migration_file.rb +93 -0
- data/lib/schema-evolution-manager/preconditions.rb +61 -0
- data/lib/schema-evolution-manager/rdoc_usage.rb +37 -0
- data/lib/schema-evolution-manager/script_error.rb +19 -0
- data/lib/schema-evolution-manager/scripts.rb +95 -0
- data/lib/schema-evolution-manager/sem_info.rb +72 -0
- data/lib/schema-evolution-manager/sem_version.rb +9 -0
- data/lib/schema-evolution-manager/template.rb +39 -0
- data/lib/schema-evolution-manager/version.rb +71 -0
- data/scripts/20130318-105434.sql +64 -0
- data/scripts/20130318-105456.sql +135 -0
- data/template/README.md +28 -0
- data/template/dev.rb +12 -0
- metadata +80 -0
@@ -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
|
+
$$;
|
data/template/README.md
ADDED
@@ -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
|
data/template/dev.rb
ADDED
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: []
|