Skip to content

Commit 9c116f2

Browse files
zeripathlafrikslunny
authored
Restore compatibility with SQLServer 2008 R2 in migrations (#16627)
* Restore compatibility with SQLServer 2008 R2 in migrations `ALTER TABLE DROP ... IF EXISTS ...` is only supported in SQL Server >16. The `IF EXISTS` here is a belt-and-braces and does not need to be present. Therefore can be dropped. We need to figure out some way of restricting our SQL syntax against the minimum version of SQL Server we will support. My suspicion is that `ALTER DATABASE database_name SET COMPATIBILITY_LEVEL = 100` may do that but there may be other side-effects so I am not whether to do that. Signed-off-by: Andrew Thornton <[email protected]> * try just dropping the index only Signed-off-by: Andrew Thornton <[email protected]> * use lowercase for system tables Signed-off-by: Andrew Thornton <[email protected]> Co-authored-by: Lauris BH <[email protected]> Co-authored-by: Lunny Xiao <[email protected]>
1 parent 07bc380 commit 9c116f2

File tree

1 file changed

+3
-6
lines changed

1 file changed

+3
-6
lines changed

models/migrations/migrations.go

+3-6
Original file line numberDiff line numberDiff line change
@@ -840,7 +840,7 @@ func dropTableColumns(sess *xorm.Session, tableName string, columnNames ...strin
840840
}
841841
cols += "`" + strings.ToLower(col) + "`"
842842
}
843-
sql := fmt.Sprintf("SELECT Name FROM SYS.DEFAULT_CONSTRAINTS WHERE PARENT_OBJECT_ID = OBJECT_ID('%[1]s') AND PARENT_COLUMN_ID IN (SELECT column_id FROM sys.columns WHERE lower(NAME) IN (%[2]s) AND object_id = OBJECT_ID('%[1]s'))",
843+
sql := fmt.Sprintf("SELECT Name FROM sys.default_constraints WHERE parent_object_id = OBJECT_ID('%[1]s') AND parent_column_id IN (SELECT column_id FROM sys.columns WHERE LOWER(name) IN (%[2]s) AND object_id = OBJECT_ID('%[1]s'))",
844844
tableName, strings.ReplaceAll(cols, "`", "'"))
845845
constraints := make([]string, 0)
846846
if err := sess.SQL(sql).Find(&constraints); err != nil {
@@ -851,17 +851,14 @@ func dropTableColumns(sess *xorm.Session, tableName string, columnNames ...strin
851851
return fmt.Errorf("Drop table `%s` default constraint `%s`: %v", tableName, constraint, err)
852852
}
853853
}
854-
sql = fmt.Sprintf("SELECT DISTINCT Name FROM SYS.INDEXES INNER JOIN SYS.INDEX_COLUMNS ON INDEXES.INDEX_ID = INDEX_COLUMNS.INDEX_ID AND INDEXES.OBJECT_ID = INDEX_COLUMNS.OBJECT_ID WHERE INDEXES.OBJECT_ID = OBJECT_ID('%[1]s') AND INDEX_COLUMNS.COLUMN_ID IN (SELECT column_id FROM sys.columns WHERE lower(NAME) IN (%[2]s) AND object_id = OBJECT_ID('%[1]s'))",
854+
sql = fmt.Sprintf("SELECT DISTINCT Name FROM sys.indexes INNER JOIN sys.index_columns ON indexes.index_id = index_columns.index_id AND indexes.object_id = index_columns.object_id WHERE indexes.object_id = OBJECT_ID('%[1]s') AND index_columns.column_id IN (SELECT column_id FROM sys.columns WHERE LOWER(name) IN (%[2]s) AND object_id = OBJECT_ID('%[1]s'))",
855855
tableName, strings.ReplaceAll(cols, "`", "'"))
856856
constraints = make([]string, 0)
857857
if err := sess.SQL(sql).Find(&constraints); err != nil {
858858
return fmt.Errorf("Find constraints: %v", err)
859859
}
860860
for _, constraint := range constraints {
861-
if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` DROP CONSTRAINT IF EXISTS `%s`", tableName, constraint)); err != nil {
862-
return fmt.Errorf("Drop table `%s` index constraint `%s`: %v", tableName, constraint, err)
863-
}
864-
if _, err := sess.Exec(fmt.Sprintf("DROP INDEX IF EXISTS `%[2]s` ON `%[1]s`", tableName, constraint)); err != nil {
861+
if _, err := sess.Exec(fmt.Sprintf("DROP INDEX `%[2]s` ON `%[1]s`", tableName, constraint)); err != nil {
865862
return fmt.Errorf("Drop index `%[2]s` on `%[1]s`: %v", tableName, constraint, err)
866863
}
867864
}

0 commit comments

Comments
 (0)