Сгенерированные SSMS сценарии изменений против пользовательских сценариев - PullRequest
0 голосов
/ 04 марта 2020

Будучи главным разработчиком C#, я с радостью позволил SSMS генерировать для меня сценарии изменений, чтобы мне не пришлось беспокоиться.

Но теперь я хочу сделать простое изменение в двух столбцах с типа данных int на десятичный. Когда я использую конструктор SSMS, он генерирует довольно длинный и сложный сценарий, который создает временную таблицу, копирует все данные в нее, затем удаляет исходную таблицу и заново создает ее, а затем копирует данные. Он также выполняет сброс индексов и триггеров. Это кажется излишним для простого изменения типа данных.

Кажется, что это можно сделать с помощью простого скрипта alter table alter column и сделать с ним. Я что-то пропустил? Лучше всего написать собственный скрипт? Или просто go со сценарием?

Это рабочая база данных, поэтому я хочу принять адекватные меры предосторожности. Я знаю, что администраторы базы данных на моей повседневной работе никогда бы даже не подумали об использовании такого сгенерированного скрипта.

Просто для удовольствия, это сгенерированный скрипт:

BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.[Order]
    DROP CONSTRAINT FK_Order_County
GO
ALTER TABLE dbo.County SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.[Order]
    DROP CONSTRAINT FK_Order_AspNetUsers
GO
ALTER TABLE dbo.[Order]
    DROP CONSTRAINT FK_Order_AspNetUsers1
GO
ALTER TABLE dbo.AspNetUsers SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.[Order]
    DROP CONSTRAINT FK_Order_Vendor
GO
ALTER TABLE dbo.Vendor SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.[Order]
    DROP CONSTRAINT FK_Order_CustomerSearchType
GO
ALTER TABLE dbo.SearchRequest SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.[Order]
    DROP CONSTRAINT FK_Order_StateProvince
GO
ALTER TABLE dbo.StateProvince SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.[Order]
    DROP CONSTRAINT FK_Order_OrderStatus
GO
ALTER TABLE dbo.OrderStatus SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.[Order]
    DROP CONSTRAINT FK_Order_Customer
GO
ALTER TABLE dbo.Customer SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.[Order]
    DROP CONSTRAINT DF__Order__ModifiedD__49E3F248
GO
ALTER TABLE dbo.[Order]
    DROP CONSTRAINT DF_Order_Guid
GO
ALTER TABLE dbo.[Order]
    DROP CONSTRAINT DF_Order_Rush
GO
CREATE TABLE dbo.Tmp_Order
    (
    OrderId int NOT NULL IDENTITY (15000, 1),
    CustomerFileNo nvarchar(20) NULL,
    CustomerId int NULL,
    OrderDate date NULL,
    CustomerDueDate date NULL,
    ForwardDate date NULL,
    OrderStatusId int NOT NULL,
    SearchRequestId int NULL,
    Owners nvarchar(500) NULL,
    AddressLine1 nvarchar(500) NULL,
    AddressLine2 nvarchar(500) NULL,
    City nvarchar(500) NULL,
    PostalCode nvarchar(15) NULL,
    CountyId int NULL,
    PinNumbers nvarchar(500) NULL,
    VendorId int NULL,
    VendorETA date NULL,
    DateReceived date NULL,
    OutDate date NULL,
    Price money NULL,
    CopyCost money NULL,
    CreatedBy nvarchar(256) NULL,
    ModifiedDate datetime NULL,
    SearchRequestDescription nvarchar(MAX) NULL,
    Notes nvarchar(MAX) NULL,
    StateProvinceId int NULL,
    Guid uniqueidentifier NOT NULL,
    ResearcherId nvarchar(450) NULL,
    ManagerId nvarchar(450) NULL,
    CompletedDate datetimeoffset(0) NULL,
    DeletedDate datetimeoffset(0) NULL,
    OrderDateTime datetimeoffset(0) NULL,
    IsRush bit NOT NULL,
    OrderValue decimal(18, 2) NULL,
    OrderCost decimal(18, 2) NULL
    )  ON [PRIMARY]
     TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_Order SET (LOCK_ESCALATION = TABLE)
GO
ALTER TABLE dbo.Tmp_Order ADD CONSTRAINT
    DF__Order__ModifiedD__49E3F248 DEFAULT (getdate()) FOR ModifiedDate
GO
ALTER TABLE dbo.Tmp_Order ADD CONSTRAINT
    DF_Order_Guid DEFAULT (newid()) FOR Guid
GO
ALTER TABLE dbo.Tmp_Order ADD CONSTRAINT
    DF_Order_Rush DEFAULT ((0)) FOR IsRush
GO
SET IDENTITY_INSERT dbo.Tmp_Order ON
GO
IF EXISTS(SELECT * FROM dbo.[Order])
     EXEC('INSERT INTO dbo.Tmp_Order (OrderId, CustomerFileNo, CustomerId, OrderDate, CustomerDueDate, ForwardDate, OrderStatusId, SearchRequestId, Owners, AddressLine1, AddressLine2, City, PostalCode, CountyId, PinNumbers, VendorId, VendorETA, DateReceived, OutDate, Price, CopyCost, CreatedBy, ModifiedDate, SearchRequestDescription, Notes, StateProvinceId, Guid, ResearcherId, ManagerId, CompletedDate, DeletedDate, OrderDateTime, IsRush, OrderValue, OrderCost)
        SELECT OrderId, CustomerFileNo, CustomerId, OrderDate, CustomerDueDate, ForwardDate, OrderStatusId, SearchRequestId, Owners, AddressLine1, AddressLine2, City, PostalCode, CountyId, PinNumbers, VendorId, VendorETA, DateReceived, OutDate, Price, CopyCost, CreatedBy, ModifiedDate, SearchRequestDescription, Notes, StateProvinceId, Guid, ResearcherId, ManagerId, CompletedDate, DeletedDate, OrderDateTime, IsRush, CONVERT(decimal(18, 2), OrderValue), CONVERT(decimal(18, 2), OrderCost) FROM dbo.[Order] WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_Order OFF
GO
ALTER TABLE dbo.OrderNotes
    DROP CONSTRAINT FK_OrderNotes_Order
GO
ALTER TABLE dbo.Attachments
    DROP CONSTRAINT FK_OrderFiles_Order
GO
ALTER TABLE dbo.PrivateAttachments
    DROP CONSTRAINT FK_PrivateAttachments_Order
GO
DROP TABLE dbo.[Order]
GO
EXECUTE sp_rename N'dbo.Tmp_Order', N'Order', 'OBJECT' 
GO
ALTER TABLE dbo.[Order] ADD CONSTRAINT
    PK_Order PRIMARY KEY CLUSTERED 
    (
    OrderId
    ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO
ALTER TABLE dbo.[Order] ADD CONSTRAINT
    FK_Order_Customer FOREIGN KEY
    (
    CustomerId
    ) REFERENCES dbo.Customer
    (
    CustomerId
    ) ON UPDATE  NO ACTION 
     ON DELETE  NO ACTION 

GO
ALTER TABLE dbo.[Order] ADD CONSTRAINT
    FK_Order_OrderStatus FOREIGN KEY
    (
    OrderStatusId
    ) REFERENCES dbo.OrderStatus
    (
    OrderStatusId
    ) ON UPDATE  NO ACTION 
     ON DELETE  NO ACTION 

GO
ALTER TABLE dbo.[Order] ADD CONSTRAINT
    FK_Order_StateProvince FOREIGN KEY
    (
    StateProvinceId
    ) REFERENCES dbo.StateProvince
    (
    StateProvinceId
    ) ON UPDATE  NO ACTION 
     ON DELETE  NO ACTION 

GO
ALTER TABLE dbo.[Order] ADD CONSTRAINT
    FK_Order_CustomerSearchType FOREIGN KEY
    (
    SearchRequestId
    ) REFERENCES dbo.SearchRequest
    (
    SearchRequestId
    ) ON UPDATE  NO ACTION 
     ON DELETE  NO ACTION 

GO
ALTER TABLE dbo.[Order] ADD CONSTRAINT
    FK_Order_Vendor FOREIGN KEY
    (
    VendorId
    ) REFERENCES dbo.Vendor
    (
    VendorId
    ) ON UPDATE  NO ACTION 
     ON DELETE  NO ACTION 

GO
ALTER TABLE dbo.[Order] ADD CONSTRAINT
    FK_Order_AspNetUsers FOREIGN KEY
    (
    ResearcherId
    ) REFERENCES dbo.AspNetUsers
    (
    Id
    ) ON UPDATE  NO ACTION 
     ON DELETE  NO ACTION 

GO
ALTER TABLE dbo.[Order] ADD CONSTRAINT
    FK_Order_AspNetUsers1 FOREIGN KEY
    (
    ManagerId
    ) REFERENCES dbo.AspNetUsers
    (
    Id
    ) ON UPDATE  NO ACTION 
     ON DELETE  NO ACTION 

GO
ALTER TABLE dbo.[Order] ADD CONSTRAINT
    FK_Order_County FOREIGN KEY
    (
    CountyId
    ) REFERENCES dbo.County
    (
    CountyId
    ) ON UPDATE  NO ACTION 
     ON DELETE  NO ACTION 

GO
CREATE trigger [dbo].[trUpdateGuidAfterVendorChange] on dbo.[Order]
after update
as
begin
   set nocount on;
   update O set [Guid]=newid()
   from  [Order] O 
   inner join deleted d on O.OrderId=d.OrderId 
   where O.VendorId <> d.VendorId
end
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.PrivateAttachments ADD CONSTRAINT
    FK_PrivateAttachments_Order FOREIGN KEY
    (
    OrderId
    ) REFERENCES dbo.[Order]
    (
    OrderId
    ) ON UPDATE  NO ACTION 
     ON DELETE  NO ACTION 

GO
ALTER TABLE dbo.PrivateAttachments SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.Attachments ADD CONSTRAINT
    FK_OrderFiles_Order FOREIGN KEY
    (
    OrderId
    ) REFERENCES dbo.[Order]
    (
    OrderId
    ) ON UPDATE  NO ACTION 
     ON DELETE  NO ACTION 

GO
ALTER TABLE dbo.Attachments SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.OrderNotes ADD CONSTRAINT
    FK_OrderNotes_Order FOREIGN KEY
    (
    OrderId
    ) REFERENCES dbo.[Order]
    (
    OrderId
    ) ON UPDATE  NO ACTION 
     ON DELETE  NO ACTION 

GO
ALTER TABLE dbo.OrderNotes SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...