diff --git a/src/test/java/io/ebean/migration/MigrationRunner_platform_Test.java b/src/test/java/io/ebean/migration/MigrationRunner_platform_Test.java index 5efebcc..a939c42 100644 --- a/src/test/java/io/ebean/migration/MigrationRunner_platform_Test.java +++ b/src/test/java/io/ebean/migration/MigrationRunner_platform_Test.java @@ -128,7 +128,7 @@ public void sqlServer_migration() throws SQLException { MigrationConfig config = sqlServerMigrationConfig(); - config.setMigrationPath("dbmig_basic"); + config.setMigrationPath("dbmig_sqlserver"); MigrationRunner runner = new MigrationRunner(config); runner.run(); diff --git a/src/test/resources/dbmig_sqlserver/1.1__initial.sql b/src/test/resources/dbmig_sqlserver/1.1__initial.sql new file mode 100644 index 0000000..c4aaa00 --- /dev/null +++ b/src/test/resources/dbmig_sqlserver/1.1__initial.sql @@ -0,0 +1,12 @@ +create table m1 +( + id integer, + acol varchar(20) +); + +create table m2 +( + id integer, + acol varchar(20), + bcol timestamp +); diff --git a/src/test/resources/dbmig_sqlserver/1.2__add_m3.sql b/src/test/resources/dbmig_sqlserver/1.2__add_m3.sql new file mode 100644 index 0000000..0b975c7 --- /dev/null +++ b/src/test/resources/dbmig_sqlserver/1.2__add_m3.sql @@ -0,0 +1,9 @@ +create table m3 +( + id integer, + acol varchar(20), + bcol timestamp +); + +insert into m3 (id, acol) +VALUES (1, 'text with ; sign'); -- plus some comment diff --git a/src/test/resources/dbmig_sqlserver/I__create_procs.sql b/src/test/resources/dbmig_sqlserver/I__create_procs.sql new file mode 100644 index 0000000..84e933e --- /dev/null +++ b/src/test/resources/dbmig_sqlserver/I__create_procs.sql @@ -0,0 +1,114 @@ +-- Initial script to create stored procedures etc for sqlserver platform + +-- create table-value-parameters +if not exists (select name from sys.types where name = 'ebean_bigint_tvp') +create type ebean_bigint_tvp as table (c1 bigint); +if not exists (select name from sys.types where name = 'ebean_float_tvp') +create type ebean_float_tvp as table (c1 float); +if not exists (select name from sys.types where name = 'ebean_bit_tvp') +create type ebean_bit_tvp as table (c1 bit); +if not exists (select name from sys.types where name = 'ebean_date_tvp') +create type ebean_date_tvp as table (c1 date); +if not exists (select name from sys.types where name = 'ebean_time_tvp') +create type ebean_time_tvp as table (c1 time); +if not exists (select name from sys.types where name = 'ebean_uniqueidentifier_tvp') +create type ebean_uniqueidentifier_tvp as table (c1 uniqueidentifier); +if not exists (select name from sys.types where name = 'ebean_nvarchar_tvp') +create type ebean_nvarchar_tvp as table (c1 nvarchar(max)); + +delimiter $$ +-- +-- PROCEDURE: usp_ebean_drop_indices TABLE, COLUMN +-- deletes all indices referring to TABLE.COLUMN +-- +CREATE OR ALTER PROCEDURE usp_ebean_drop_indices @tableName nvarchar(255), @columnName nvarchar(255) +AS SET NOCOUNT ON +declare @sql nvarchar(1000) +declare @indexName nvarchar(255) +BEGIN + DECLARE index_cursor CURSOR FOR SELECT i.name from sys.indexes i + join sys.index_columns ic on ic.object_id = i.object_id and ic.index_id = i.index_id + join sys.columns c on c.object_id = ic.object_id and c.column_id = ic.column_id + where i.object_id = OBJECT_ID(@tableName) AND c.name = @columnName; + OPEN index_cursor + FETCH NEXT FROM index_cursor INTO @indexName + WHILE @@FETCH_STATUS = 0 + BEGIN + set @sql = 'drop index ' + @indexName + ' on ' + @tableName; + EXECUTE(@sql); + + FETCH NEXT FROM index_cursor INTO @indexName + END; + CLOSE index_cursor; + DEALLOCATE index_cursor; +END +$$ + +delimiter $$ +-- +-- PROCEDURE: usp_ebean_drop_default_constraint TABLE, COLUMN +-- deletes the default constraint, which has a random name +-- +CREATE OR ALTER PROCEDURE usp_ebean_drop_default_constraint @tableName nvarchar(255), @columnName nvarchar(255) +AS SET NOCOUNT ON +declare @tmp nvarchar(1000) +BEGIN + select @tmp = t1.name from sys.default_constraints t1 + join sys.columns t2 on t1.object_id = t2.default_object_id + where t1.parent_object_id = OBJECT_ID(@tableName) and t2.name = @columnName; + + if @tmp is not null EXEC('alter table ' + @tableName +' drop constraint ' + @tmp); +END +$$ + +delimiter $$ +-- +-- PROCEDURE: usp_ebean_drop_constraints TABLE, COLUMN +-- deletes constraints and foreign keys refering to TABLE.COLUMN +-- +CREATE OR ALTER PROCEDURE usp_ebean_drop_constraints @tableName nvarchar(255), @columnName nvarchar(255) +AS SET NOCOUNT ON +declare @sql nvarchar(1000) +declare @constraintName nvarchar(255) +BEGIN + DECLARE name_cursor CURSOR FOR + SELECT cc.name from sys.check_constraints cc + join sys.columns c on c.object_id = cc.parent_object_id and c.column_id = cc.parent_column_id + where parent_object_id = OBJECT_ID(@tableName) AND c.name = @columnName + UNION SELECT fk.name from sys.foreign_keys fk + join sys.foreign_key_columns fkc on fkc.constraint_object_id = fk.object_id + and fkc.parent_object_id = fk.parent_object_id + join sys.columns c on c.object_id = fkc.parent_object_id and c.column_id = fkc.parent_column_id + where fkc.parent_object_id = OBJECT_ID(@tableName) AND c.name = @columnName; + + OPEN name_cursor + FETCH NEXT FROM name_cursor INTO @constraintName + WHILE @@FETCH_STATUS = 0 + BEGIN + set @sql = 'alter table ' + @tableName + ' drop constraint ' + @constraintName; + EXECUTE(@sql); + + FETCH NEXT FROM name_cursor INTO @constraintName + END; + CLOSE name_cursor; + DEALLOCATE name_cursor; +END +$$ + +delimiter $$ +-- +-- PROCEDURE: usp_ebean_drop_column TABLE, COLUMN +-- deletes the column annd ensures that all indices and constraints are dropped first +-- +CREATE OR ALTER PROCEDURE usp_ebean_drop_column @tableName nvarchar(255), @columnName nvarchar(255) +AS SET NOCOUNT ON +declare @sql nvarchar(1000) +BEGIN + EXEC usp_ebean_drop_indices @tableName, @columnName; + EXEC usp_ebean_drop_default_constraint @tableName, @columnName; + EXEC usp_ebean_drop_constraints @tableName, @columnName; + + set @sql = 'alter table ' + @tableName + ' drop column ' + @columnName; + EXECUTE(@sql); +END +$$