diff --git a/src/sources/mssql/mssql-schema.lisp b/src/sources/mssql/mssql-schema.lisp index e84033f2..bdc6dab6 100644 --- a/src/sources/mssql/mssql-schema.lisp +++ b/src/sources/mssql/mssql-schema.lisp @@ -120,7 +120,7 @@ (defmethod fetch-foreign-keys ((catalog catalog) (mssql copy-mssql) &key including excluding) - "Get the list of MSSQL index definitions per table." + "Get the list of MSSQL foreign key definitions per table." (loop :with incl-where := (filter-list-to-where-clause mssql including :not nil @@ -130,8 +130,8 @@ mssql excluding :not t :schema-col "kcu1.table_schema" :table-col "kcu1.table_name") - :for (fkey-name schema-name table-name col - fschema-name ftable-name fcol + :for (fkey-name schema-name table-name cols + fschema-name ftable-name fcols fk-update-rule fk-delete-rule) :in (mssql-query (sql "/mssql/list-all-fkeys.sql" (db-name *mssql-db*) (db-name *mssql-db*) @@ -143,20 +143,16 @@ (table (find-table schema table-name)) (fschema (find-schema catalog fschema-name)) (ftable (find-table fschema ftable-name)) - (col-name (apply-identifier-case col)) - (fcol-name (apply-identifier-case fcol)) - (pg-fkey - (make-fkey :name (apply-identifier-case fkey-name) - :table table - :columns nil - :foreign-table ftable - :foreign-columns nil - :update-rule fk-update-rule - :delete-rule fk-delete-rule)) - (fkey - (maybe-add-fkey table fkey-name pg-fkey :key #'fkey-name))) - (push-to-end col-name (fkey-columns fkey)) - (push-to-end fcol-name (fkey-foreign-columns fkey))) + (fkey (make-fkey :table table + :columns (mapcar #'apply-identifier-case + (sq:split-sequence #\, cols)) + :foreign-table ftable + :foreign-columns (mapcar + #'apply-identifier-case + (sq:split-sequence #\, fcols)) + :update-rule fk-update-rule + :delete-rule fk-delete-rule))) + (add-fkey table fkey) :finally (return catalog))) diff --git a/src/sources/mssql/sql/list-all-fkeys.sql b/src/sources/mssql/sql/list-all-fkeys.sql index 89e74cad..40d9c0e9 100644 --- a/src/sources/mssql/sql/list-all-fkeys.sql +++ b/src/sources/mssql/sql/list-all-fkeys.sql @@ -7,10 +7,10 @@ REPLACE(KCU1.CONSTRAINT_NAME, '.', '_') AS 'CONSTRAINT_NAME' , KCU1.TABLE_SCHEMA AS 'TABLE_SCHEMA' , KCU1.TABLE_NAME AS 'TABLE_NAME' - , KCU1.COLUMN_NAME AS 'COLUMN_NAME' + , STRING_AGG(KCU1.COLUMN_NAME, ',') AS 'COLUMNS' , KCU2.TABLE_SCHEMA AS 'UNIQUE_TABLE_SCHEMA' , KCU2.TABLE_NAME AS 'UNIQUE_TABLE_NAME' - , KCU2.COLUMN_NAME AS 'UNIQUE_COLUMN_NAME' + , STRING_AGG(KCU2.COLUMN_NAME, ',') AS 'UNIQUE_COLUMN_NAME' , RC.UPDATE_RULE AS 'UPDATE_RULE' , RC.DELETE_RULE AS 'DELETE_RULE' @@ -34,4 +34,11 @@ ~:[~*~;and (~{~a~^ or ~})~] ~:[~*~;and (~{~a~^ and ~})~] -ORDER BY KCU1.CONSTRAINT_NAME, KCU1.ORDINAL_POSITION; + GROUP BY + KCU1.CONSTRAINT_NAME + , KCU1.TABLE_SCHEMA + , KCU1.TABLE_NAME + , KCU2.TABLE_SCHEMA + , KCU2.TABLE_NAME + , RC.UPDATE_RULE + , RC.DELETE_RULE;