diff --git a/src/commands/pull.ts b/src/commands/pull.ts index 34a95f2..8229ffd 100644 --- a/src/commands/pull.ts +++ b/src/commands/pull.ts @@ -34,7 +34,6 @@ export default class Pull { /** * Spinner instance. */ - // tslint:disable-next-line:typedef private spinner = ora(); /** diff --git a/src/commands/push.ts b/src/commands/push.ts index 0640652..687a662 100644 --- a/src/commands/push.ts +++ b/src/commands/push.ts @@ -16,7 +16,6 @@ export default class Push { /** * Spinner instance. */ - // tslint:disable-next-line:typedef private spinner = ora(); /** diff --git a/src/generators/mssql.ts b/src/generators/mssql.ts index e1a5e23..54493e5 100644 --- a/src/generators/mssql.ts +++ b/src/generators/mssql.ts @@ -225,10 +225,6 @@ export default class MSSQLGenerator { output += EOL; }); - if (foreignKeys.length && indexes.length) { - output += EOL; - } - const groupedIndexes = this.groupByName(indexes); Object.keys(groupedIndexes).forEach(name => { output += this.index(groupedIndexes[name]); @@ -440,7 +436,7 @@ export default class MSSQLGenerator { break; } - if (item.collation_name) { + if (item.collation_name && !item.is_user_defined) { output += ` COLLATE ${item.collation_name}`; } @@ -518,10 +514,16 @@ export default class MSSQLGenerator { */ private foreignKey(item: SqlForeignKey): string { const objectId = `[${item.schema}].[${item.table}]`; + const keyObjectId = `[${item.schema}].[${item.name}]`; const parentObjectId = `[${item.parent_schema}].[${item.parent_table}]`; let output = ''; - output += `ALTER TABLE ${objectId} WITH ${item.is_not_trusted ? 'NOCHECK' : 'CHECK'}`; + output += `IF NOT EXISTS (SELECT 1 FROM sys.foreign_keys WHERE object_id = OBJECT_ID('${keyObjectId}') AND parent_object_id = OBJECT_ID('${objectId}'))`; + output += EOL; + output += 'BEGIN'; + output += EOL; + + output += this.indent() + `ALTER TABLE ${objectId} WITH ${item.is_not_trusted ? 'NOCHECK' : 'CHECK'}`; output += ` ADD CONSTRAINT [${item.name}] FOREIGN KEY ([${item.column}])`; output += ` REFERENCES ${parentObjectId} ([${item.reference}])`; @@ -550,7 +552,10 @@ export default class MSSQLGenerator { } output += EOL; - output += `ALTER TABLE ${objectId} CHECK CONSTRAINT [${item.name}]`; + output += this.indent() + `ALTER TABLE ${objectId} CHECK CONSTRAINT [${item.name}]`; + output += EOL; + output += 'END'; + output += EOL; return output; } diff --git a/src/queries/interfaces.ts b/src/queries/interfaces.ts index 4652a5e..d1d5f50 100644 --- a/src/queries/interfaces.ts +++ b/src/queries/interfaces.ts @@ -46,6 +46,7 @@ export interface SqlColumn { object_id: number; name: string; datatype: string; + is_user_defined: boolean; max_length: number; is_computed: boolean; precision: number; diff --git a/src/queries/mssql.ts b/src/queries/mssql.ts index d2f3900..4c11c62 100644 --- a/src/queries/mssql.ts +++ b/src/queries/mssql.ts @@ -36,6 +36,7 @@ export const columnsRead = ` c.object_id, c.name, tp.name AS [datatype], + tp.is_user_defined, c.max_length, c.is_computed, c.precision, @@ -96,7 +97,7 @@ export const foreignKeysRead = ` c.name AS [column], rc.name AS [reference], fk.name, - SCHEMA_NAME(ro.schema_id) AS [schema], + SCHEMA_NAME(po.schema_id) AS [schema], po.name AS [table], SCHEMA_NAME(ro.schema_id) AS [parent_schema], ro.name AS [parent_table], diff --git a/test/appveyor-cache.json b/test/appveyor-cache.json index d5a08d2..9a0d480 100644 --- a/test/appveyor-cache.json +++ b/test/appveyor-cache.json @@ -60,74 +60,74 @@ "./_sql-database/tables/dbo.AWBuildVersion.sql": "29c80eba0303f1a759266e3cf4c5b330bf28bb7b", "./_sql-database/tables/dbo.DatabaseLog.sql": "9b20616aecea60d1132431f20dce0fde9afb31de", "./_sql-database/tables/dbo.ErrorLog.sql": "6c739cf6b1b1aa3961fe170e7d0a0ae923231dc6", - "./_sql-database/tables/HumanResources.Department.sql": "16e8a95f3380f90090c9e96ff5b408868305b6b5", - "./_sql-database/tables/HumanResources.Employee.sql": "9dba9bd03b686e6a2b0bf70f19daa45c3b4ca2ef", - "./_sql-database/tables/HumanResources.EmployeeDepartmentHistory.sql": "388d78e65b87d5f9de6074c549c381601d907b98", - "./_sql-database/tables/HumanResources.EmployeePayHistory.sql": "6509eac69c98d9a66aa6af0a1e53cd39f677a7fb", - "./_sql-database/tables/HumanResources.JobCandidate.sql": "9a346d58c5c8f29b4894e4a1e8d58f962be01bb2", - "./_sql-database/tables/HumanResources.Shift.sql": "f1953aeb0ae3de120d344d759c220dc6362180d6", - "./_sql-database/tables/Person.Address.sql": "28533f6e3d2ffe3c2b58f37b95b82b30df485b0a", - "./_sql-database/tables/Person.AddressType.sql": "0cc5fcebeadd8d09ee9ee357f35ab1937cc8dfab", + "./_sql-database/tables/HumanResources.Department.sql": "4bf0595e675d1c71d990a77fc33d68c396b0d241", + "./_sql-database/tables/HumanResources.Employee.sql": "efb72f408a7abffb1f530000d5dcf5a2ff975df6", + "./_sql-database/tables/HumanResources.EmployeeDepartmentHistory.sql": "384b0a3693eb66806a70443811915a52e5139821", + "./_sql-database/tables/HumanResources.EmployeePayHistory.sql": "e678293368b54c34b83cfbdd5ed3dbedc44abbe8", + "./_sql-database/tables/HumanResources.JobCandidate.sql": "dd7d9e12a1ae830f413c842bbde6722060272232", + "./_sql-database/tables/HumanResources.Shift.sql": "5412bee432ceac402b6fd77c6ecf87aa625bb38f", + "./_sql-database/tables/Person.Address.sql": "68680d701dff19b65fef954f220a8533b307404b", + "./_sql-database/tables/Person.AddressType.sql": "8e5a5bfbf1e131930b4140e13093f24def40241a", "./_sql-database/tables/Person.BusinessEntity.sql": "974a196e5c5b127d95e7f85f24ac45e04117684a", - "./_sql-database/tables/Person.BusinessEntityAddress.sql": "d19d65c68026e7636409feb863278ddd98032538", - "./_sql-database/tables/Person.BusinessEntityContact.sql": "d340af0c1ef314f52675fc15258e89019ed9d0f3", - "./_sql-database/tables/Person.ContactType.sql": "c68b1b6e52beba70915e1800a1f5e4b8f8072311", - "./_sql-database/tables/Person.CountryRegion.sql": "b750353ffb7364461bd3c6c582cfb7cceb115a8e", - "./_sql-database/tables/Person.EmailAddress.sql": "9aa73683fb5f17bd59b3ed1745015f8d58061c65", - "./_sql-database/tables/Person.Password.sql": "ae070f1dfe70f94c64eb741b4b995a21165b7a02", - "./_sql-database/tables/Person.Person.sql": "26266d0e4ce5274b944a446b87f413e149bb5182", - "./_sql-database/tables/Person.PersonPhone.sql": "44e096956c3ddbda62fc3624c7e4134058c3c16d", - "./_sql-database/tables/Person.PhoneNumberType.sql": "b8a44911f6b6a15640ae5e5ce94649789057fb82", - "./_sql-database/tables/Person.StateProvince.sql": "6d6a771dd3efc03e2176763af93210be56a3e1f2", - "./_sql-database/tables/Production.BillOfMaterials.sql": "5ba81e841cbed8a4d084a6a4ed5d2294558d1bd8", - "./_sql-database/tables/Production.Culture.sql": "53427c04a478c3cd72950285861086be014e735b", - "./_sql-database/tables/Production.Document.sql": "8b258dc4e3dfda4d353a829c18b176ee94522792", + "./_sql-database/tables/Person.BusinessEntityAddress.sql": "b8f0dc95ff96356fd546f88027be3ec2549694a5", + "./_sql-database/tables/Person.BusinessEntityContact.sql": "db00db36a8c305369614ccc5b928e8597e3b1cc2", + "./_sql-database/tables/Person.ContactType.sql": "ae76fd3b5a19761acd6957cc95ef81b23bbc0458", + "./_sql-database/tables/Person.CountryRegion.sql": "6dcb67e6e55ec55854090e164562551a42eb0880", + "./_sql-database/tables/Person.EmailAddress.sql": "e94818c21608b6c16059debc16f29a09befe0f99", + "./_sql-database/tables/Person.Password.sql": "a41a0ec2d9436debe18d14814320d64039a6571f", + "./_sql-database/tables/Person.Person.sql": "adfd8437559df08805009a01a639406d7a06c614", + "./_sql-database/tables/Person.PersonPhone.sql": "aa5de40c666f70eecfc40a3067bfe01de5c8e123", + "./_sql-database/tables/Person.PhoneNumberType.sql": "b3f1927d41efef70d3163b872248fe10d59a2836", + "./_sql-database/tables/Person.StateProvince.sql": "7282919a39b919cf793bd7d5ddbc20a817aa418d", + "./_sql-database/tables/Production.BillOfMaterials.sql": "306c49bee053c831da96204ff2a5b7e0873b8f08", + "./_sql-database/tables/Production.Culture.sql": "669198dedd761006eab9c95d4c2787b81af382e7", + "./_sql-database/tables/Production.Document.sql": "4661d248da6edf9c8225398f3450e79eb35531ee", "./_sql-database/tables/Production.Illustration.sql": "b52688b6f9683af379664a18d369ec37aa0a876b", - "./_sql-database/tables/Production.Location.sql": "e1f2ff0c307dff2f685331c31283ee9b34031c19", - "./_sql-database/tables/Production.Product.sql": "15cd2ad22366b1bf4c84454674399c0582903fac", - "./_sql-database/tables/Production.ProductCategory.sql": "030ed0a6766dc8092fba72ecffe23497c2c010a6", - "./_sql-database/tables/Production.ProductCostHistory.sql": "7f7612e7ce5b899e8cab43be6e04dd6cd428e819", + "./_sql-database/tables/Production.Location.sql": "3925e29b56e538ac8a809e628e10bf131e88c510", + "./_sql-database/tables/Production.Product.sql": "6772a934c8b90450de2593cff0cf08f29badd71f", + "./_sql-database/tables/Production.ProductCategory.sql": "fa70876299e8516c069f23fd487020382bb492dc", + "./_sql-database/tables/Production.ProductCostHistory.sql": "2f000a5d847fd588eb0e2731959497c116fe1766", "./_sql-database/tables/Production.ProductDescription.sql": "53200ad11d1c00bb4c5aba33084a19f5d926610a", - "./_sql-database/tables/Production.ProductDocument.sql": "f13f01454d737929b928e3b522039c4e54edc61f", - "./_sql-database/tables/Production.ProductInventory.sql": "a4442cd1f38f63445f3cd3c86476e22761186c57", - "./_sql-database/tables/Production.ProductListPriceHistory.sql": "302e55ad539e07e3ec0fc6342919ba69d140a94e", - "./_sql-database/tables/Production.ProductModel.sql": "48a030d42ab5eb3366fd5a5df3e7a953df67d947", - "./_sql-database/tables/Production.ProductModelIllustration.sql": "495241be61408de5297867c0deb9f7f5f816ef7d", - "./_sql-database/tables/Production.ProductModelProductDescriptionCulture.sql": "847f155dd3fa587622b72460c1bc9eb63c347f3d", + "./_sql-database/tables/Production.ProductDocument.sql": "0bc9e98df535489220831e319911a3e91f37af84", + "./_sql-database/tables/Production.ProductInventory.sql": "7b7dd3eb81441b115f7dbd3653184b22d2884977", + "./_sql-database/tables/Production.ProductListPriceHistory.sql": "43a187a7830aecc7cac2c66679f65b0408812bd7", + "./_sql-database/tables/Production.ProductModel.sql": "45044e688a4df4b4145ef29b143ecacc0002d530", + "./_sql-database/tables/Production.ProductModelIllustration.sql": "a0fc4231412400c3778340c9bf591d3ef34bf9ad", + "./_sql-database/tables/Production.ProductModelProductDescriptionCulture.sql": "f7a4713f2c77236a2791f26ecc9e0951fcd2679b", "./_sql-database/tables/Production.ProductPhoto.sql": "d7b72993e64484f44bb8932ed4e80a353cff329a", - "./_sql-database/tables/Production.ProductProductPhoto.sql": "a72f8c2ff0d4d1bc8d6edafb3589c917b54d422a", - "./_sql-database/tables/Production.ProductReview.sql": "6ffa28b9cad03c7c4f5b40603c75701dc69bb1f5", - "./_sql-database/tables/Production.ProductSubcategory.sql": "19a01581d4db46c88132f5a3b9ce7009ad8156d9", - "./_sql-database/tables/Production.ScrapReason.sql": "6f82e4146a5c13b824467c1f810fa549a15ee1dc", - "./_sql-database/tables/Production.TransactionHistory.sql": "d6e701ada56716b459fa8e2951f679dc2a9a8b5b", + "./_sql-database/tables/Production.ProductProductPhoto.sql": "13698d2287e6db1afbd1bec573381e2227c6cadd", + "./_sql-database/tables/Production.ProductReview.sql": "85ef51696acecab21e2d2944f3e9af874c916a90", + "./_sql-database/tables/Production.ProductSubcategory.sql": "4a42eb49408d68c684c801fdbf609a3226e2b35b", + "./_sql-database/tables/Production.ScrapReason.sql": "938430d791716420e4b87daf758fc33b7775f31e", + "./_sql-database/tables/Production.TransactionHistory.sql": "9a09d00eb017ea790aea36dc2dabcb2f094ecf6f", "./_sql-database/tables/Production.TransactionHistoryArchive.sql": "bfc3780f6a06bccb1855e0f80e95528729a1452a", - "./_sql-database/tables/Production.UnitMeasure.sql": "3b56196cd9ed37fc8b68bf2c14c194942363d37e", - "./_sql-database/tables/Production.WorkOrder.sql": "aa9eb6ca4a0b493b809ca261e1736152e702ee1d", - "./_sql-database/tables/Production.WorkOrderRouting.sql": "1814119607a9daa157e9df8bfd55afe6c1b20c7c", - "./_sql-database/tables/Purchasing.ProductVendor.sql": "803d72c531bc8ca9e33e0b7769ef2f733e98eb97", - "./_sql-database/tables/Purchasing.PurchaseOrderDetail.sql": "f0fd395051953ca3f1c719893bca8889aa56a818", - "./_sql-database/tables/Purchasing.PurchaseOrderHeader.sql": "4434266c290c8f55da9395a1c74b75ccd51a40dc", - "./_sql-database/tables/Purchasing.ShipMethod.sql": "d5d9ffaa11f778f775d8540e60b6991eea6b4dd0", - "./_sql-database/tables/Purchasing.Vendor.sql": "d45c593a3a208e7db47159f8ba890f93d581b9d5", - "./_sql-database/tables/Sales.CountryRegionCurrency.sql": "1ba8a44b19e5c32758d13c52966f844486fe7a99", + "./_sql-database/tables/Production.UnitMeasure.sql": "fa9d2d7d7f3765d3b4207f387a00da1017caa2c4", + "./_sql-database/tables/Production.WorkOrder.sql": "2bb7abe8a821dc1186acd6fb48089b7253d84cf5", + "./_sql-database/tables/Production.WorkOrderRouting.sql": "e8bc4941b895aed4a22d72e164149c55a36c00f1", + "./_sql-database/tables/Purchasing.ProductVendor.sql": "5679232c7304bedb60db966e179f2ef2295d98e3", + "./_sql-database/tables/Purchasing.PurchaseOrderDetail.sql": "82fe42908da1126989ce6ab95870717099922cac", + "./_sql-database/tables/Purchasing.PurchaseOrderHeader.sql": "024907fda7c121dd6f519789d4246a3ac4f7ca73", + "./_sql-database/tables/Purchasing.ShipMethod.sql": "5394f2981ad744a8dbaee1a2c38ab71147341b51", + "./_sql-database/tables/Purchasing.Vendor.sql": "ced603aa7c11d0fb9d08382789c418063b0e0edd", + "./_sql-database/tables/Sales.CountryRegionCurrency.sql": "5622b3c4f006221a6f12a30c4939445e9d9493c6", "./_sql-database/tables/Sales.CreditCard.sql": "f4af312a986ea206311b2cfaa53594be33932cb1", - "./_sql-database/tables/Sales.Currency.sql": "3331dc828656960bf1356ef6da6425feafd50668", - "./_sql-database/tables/Sales.CurrencyRate.sql": "45ad0e8274d3a4c40f9d40d23568e9c52288e998", - "./_sql-database/tables/Sales.Customer.sql": "eb190994f239ec543f8e745b98cb1bd538a0fd8e", - "./_sql-database/tables/Sales.PersonCreditCard.sql": "349d80cc451374128e5c3e3ea64fc7796d640007", - "./_sql-database/tables/Sales.SalesOrderDetail.sql": "8050b56682fa3d32aa13d34a03a69bf45adcff94", - "./_sql-database/tables/Sales.SalesOrderHeader.sql": "8abf378db9f7289f6b0aa25ae003fa52c1dc74bf", - "./_sql-database/tables/Sales.SalesOrderHeaderSalesReason.sql": "fe0a138ac26cddb3043dc06589a23f053d426894", - "./_sql-database/tables/Sales.SalesPerson.sql": "06d50274140d75ec99ddd84522878eb32125d800", - "./_sql-database/tables/Sales.SalesPersonQuotaHistory.sql": "0ba481672d45e61b4b2ddedc1e0d4d19f6a61855", - "./_sql-database/tables/Sales.SalesReason.sql": "0413b7e3e1ebf922d235daca3b17d98e6506a5ee", - "./_sql-database/tables/Sales.SalesTaxRate.sql": "85d482f23ff03285b2c263aa50a342ac94645ba1", - "./_sql-database/tables/Sales.SalesTerritory.sql": "62d33373deb7fb194207dca9d7beaa6be4d0ab0d", - "./_sql-database/tables/Sales.SalesTerritoryHistory.sql": "ea519cd56828fd219998eb54e330d87813d41e9e", - "./_sql-database/tables/Sales.ShoppingCartItem.sql": "ce1244b5f8939f831890faa9a24d56c5ea6e4991", + "./_sql-database/tables/Sales.Currency.sql": "fabf07099843b49440dcd19d8ba9ed1076c8f388", + "./_sql-database/tables/Sales.CurrencyRate.sql": "5d70f9ddae2217579f68385a51e87d383e22731f", + "./_sql-database/tables/Sales.Customer.sql": "05ef02be43fece57282fcbf4620ef784e77849f5", + "./_sql-database/tables/Sales.PersonCreditCard.sql": "d7ad3c50573afa566eea8b81d82c5e3a4cf893d0", + "./_sql-database/tables/Sales.SalesOrderDetail.sql": "f49f8e7285180f1fcb72d62bcb06a220f87c461f", + "./_sql-database/tables/Sales.SalesOrderHeader.sql": "73f740194dbd318306739fa19a9e7f9b61d32268", + "./_sql-database/tables/Sales.SalesOrderHeaderSalesReason.sql": "73ae5cd408599da33244513ad3b28b7e62c5c5e9", + "./_sql-database/tables/Sales.SalesPerson.sql": "eca6c6e1784db302f77ba4174d8309f1b531ab2f", + "./_sql-database/tables/Sales.SalesPersonQuotaHistory.sql": "ef550aaf480d195cad77ee64012550d84bfc32f5", + "./_sql-database/tables/Sales.SalesReason.sql": "f96124a0f52cdd19f97c33c9509628910e3f7e04", + "./_sql-database/tables/Sales.SalesTaxRate.sql": "b5c4fc5b8a700208102c44ce43a2d21984fe0f7c", + "./_sql-database/tables/Sales.SalesTerritory.sql": "08b85a0de37219f9490188427a94436edaeb6c2f", + "./_sql-database/tables/Sales.SalesTerritoryHistory.sql": "7fd2e928aaa27334d5b48c5d939e14cb74db3f37", + "./_sql-database/tables/Sales.ShoppingCartItem.sql": "8206e8481d09d11bc70a9641da950455fe50e154", "./_sql-database/tables/Sales.SpecialOffer.sql": "6a4dd953f1199f84324869d412ddc76b3783e85d", - "./_sql-database/tables/Sales.SpecialOfferProduct.sql": "6acdd20db2f090ef458a5b75fe8c62f1a5de2070", - "./_sql-database/tables/Sales.Store.sql": "618ef5a705beb8f46a0368ac1b41a7f08af9be1b", + "./_sql-database/tables/Sales.SpecialOfferProduct.sql": "d64c059bc3e4d7f6f5843f7c973d6d36f06100f9", + "./_sql-database/tables/Sales.Store.sql": "2df1f5fcafd6c96952bbebc30303810110c26d12", "./_sql-database/data/Person.AddressType.sql": "7fe76948d9f9e7a3c1f2a14dbb2801b869637f22", "./_sql-database/data/Person.ContactType.sql": "587c5aaa9720bd5021d062dfaf6ee58c703223b5", "./_sql-database/data/Person.CountryRegion.sql": "995b413ea7a8eeb5e6ec47ceba45cf17d8186305",