--restore database [VEPROMS] from disk = 'C:\Backups\20091211.BAK' --╔═════════════════════════════════════════════════════════════════╗ --║ TODO: Need to update Transitions and ROs to reflect the new IDs ║ --╚═════════════════════════════════════════════════════════════════╝ --USE VEPROMS -- Parameters --DECLARE @StartItemID INT --DECLARE @EndItemID INT --DECLARE @UserID NVARCHAR(100) -- <<< MS Word Sections >>> --SET @StartItemID = 53;SET @EndItemID = 53 -- EO00 Cover --SET @StartItemID = 53;SET @EndItemID = 54 -- EO00 Cover and Purpose --SET @StartItemID = 374;SET @EndItemID = 374 -- EO00 Addendums 1 --SET @StartItemID = 374;SET @EndItemID = 124 -- EO00 Addendums 1 through 5 -- <<< Steps >>> --SET @StartItemID = 1;SET @EndItemID = 1 -- EO00 --SET @StartItemID = 210;SET @EndItemID = 210 -- EO00 Step 1 --SET @StartItemID = 58;SET @EndItemID = 58 -- EO00 Step 4 --SET @StartItemID = 58;SET @EndItemID = 143 -- EO00 Step 4 through 7 --SET @StartItemID = 107;SET @EndItemID = 108 -- Substeps a and b of EO00 Step 4 --SET @StartItemID = 107;SET @EndItemID = 107 -- Substeps a of EO00 Step 4 --SET @StartItemID = 108;SET @EndItemID = 108 -- Substeps b of EO00 Step 4 --SET @UserID = 'KCopy' -- Locals --DECLARE @NewStartItemID INT -- New Start Item --DECLARE @NewEndItemID INT -- New End Item --DECLARE @DTS DATETIME -- DTS of all New Items --SET @DTS = GETDATE() -- Get the current Date and Time ALTER PROCEDURE [dbo].[CopyItemAndChildren] ( @StartItemID INT, @EndItemID INT, @UserID NVARCHAR(100) ) WITH EXECUTE AS OWNER AS BEGIN TRY -- Try Block --╔═════════════════════════════════════════════════════════════════╗ --║ BEGIN TRANSACTION to make these changes temporary ║ --╚═════════════════════════════════════════════════════════════════╝ BEGIN TRANSACTION DECLARE @Children AS TABLE ( ItemID INT PRIMARY KEY, NewItemID INT, ContentID INT, NewContentID INT ) DECLARE @NewDocuments AS TABLE ( DocID INT PRIMARY KEY, NewDocID INT ) -- Get a list of all of the Items to be copied based upon StartItemID and EndItemID -- If the StartItemID = EndItemID then it is a single item and it's children INSERT INTO @Children SELECT ItemID,ItemID,ContentID,ContentID FROM vefn_ChildItemsRange(@StartItemID,@EndItemID) -- <<< Copy Contents >>> -- Create new content rows to match the existing rows. Set the type to the Current ContentID temporarily -- so that the new content rows can be associated with the existing content rows. INSERT INTO Contents ([Number],[Text],[Type],[FormatID],[Config],[DTS],[UserID]) select [Number],[Text],[ContentID],[FormatID],[Config],@DTS,@UserID from Contents where ContentID in(Select ContentID from @Children) -- Update the @Children with the NewConentIDs UPDATE NN set NN.NewContentID = CC.ContentID From Contents CC Join @Children NN on NN.ContentID = CC.Type AND CC.DTS = @DTS and CC.UserID = @UserID -- Reset the Type column in the Contents table with the Type column from the original Records. UPDATE CC set CC.Type = CC2.Type From Contents CC Join @Children NN on NN.NewContentID = CC.ContentID Join Contents CC2 on NN.ContentID = CC2.ContentID -- Contents are done -- SELECT * From Contents where DTS = @DTS and UserID = @UserID -- <<< Copy Items >>> -- Create new item rows based upon the current item rows and the @Children table, with the NewContentIDs INSERT INTO [Items] ([PreviousID],[ContentID],[DTS],[UserID]) SELECT II.[PreviousID], -- Leave the PreviousID as is for now NN.NewContentID, @DTS, @UserID from @Children NN join Items II on II.ContentID = NN.ContentID -- Update the @Children with the NewItemIDs UPDATE NN set NN.NewItemID = II.ItemID From Items II Join @Children NN on NN.NewContentID = II.ContentID AND II.DTS = @DTS and II.UserID = @UserID -- The @Children table is now complete --SELECT * From @Children -- Update the PreviousID in the new Item rows, to the new ItemIDs based upon the old ItemIDs Update II Set II.[PreviousID] = NN.NewItemID from Items II Join @Children NN on NN.ItemID = II.PreviousID AND II.DTS = @DTS and II.UserID = @UserID -- Get the new ItemIDs based upon the old ItemIDs SELECT @NewStartItemID = NewItemID from @Children where ItemID = @StartItemID SELECT @NewEndItemID = NewItemID from @Children where ItemID = @EndItemID -- Set the PreviousID for the starting Item to null temporarily. -- This will be adjusted based upon where the step is inserted. Update Items Set PreviousID = null where ItemID = @NewStartItemID -- Items are done --SELECT * From Items where DTS = @DTS and UserID = @UserID -- <<< Copy Parts >>> INSERT INTO [Parts] ([ContentID],[FromType],[ItemID],[DTS],[UserID]) Select NNF.NewContentID,[FromType],NNT.NewItemID, @DTS, @UserID from Parts PP JOIN @Children NNF on PP.ContentID = NNF.ContentID JOIN @Children NNT on PP.ItemID = NNT.ItemID -- Parts are done -- SELECT * From Parts where DTS = @DTS and UserID = @UserID -- <<< Copy Annotations >>> INSERT INTO [Annotations] ([ItemID],[TypeID],[RtfText],[SearchText],[Config],[DTS],[UserID]) Select NewItemID, TypeID, RtfText, SearchText, Config, @DTS, @UserID from Annotations AA Join @Children NN on AA.ItemID = NN.ItemID -- Annotations are done -- SELECT * From Annotations where DTS = @DTS and UserID = @UserID -- <<< Copy Documents and Entries>>> -- logic to create Entries for Library Documents INSERT INTO [Entries] ([ContentID],[DocID],[DTS],[UserID]) SELECT NN.[NewContentID],EE.[DocID],@DTS,@UserID FROM [Entries] EE JOIN @Children NN on NN.ContentID = EE.ContentID JOIN [Documents] DD on EE.[DocID] = DD.[DocID] and Isnull(LibTitle,'') <> '' -- Logic to create new documents for any documents used that do not have libttitles INSERT INTO [Documents] ([LibTitle],[DocContent],[DocAscii],[Config],[DTS],[UserID],[FileExtension]) OUTPUT CAST(INSERTED.[LibTitle] as INT),INSERTED.[DocID] INTO @NewDocuments SELECT str(DD.[DocID]),[DocContent],[DocAscii],[Config],@DTS,@UserID,[FileExtension] FROM [Entries] EE JOIN @Children NN on NN.ContentID = EE.ContentID JOIN [Documents] DD on EE.[DocID] = DD.[DocID] and Isnull(LibTitle,'') = '' UPDATE DD SET LibTitle = '' FROM Documents DD JOIN @NewDocuments ND on DD.[DocID] = ND.[NewDocID] where DTS = @DTS and UserID = @UserID -- Documents are Done -- SELECT * From Documents where DTS = @DTS and UserID = @UserID -- Need logic to create entries for these newly created documents INSERT INTO [Entries] ([ContentID],[DocID],[DTS],[UserID]) SELECT NN.[NewContentID],ND.[NewDocID],@DTS,@UserID FROM [Entries] EE JOIN @Children NN on NN.ContentID = EE.ContentID JOIN @NewDocuments ND on EE.[DocID] = ND.[DocID] -- Entries are done -- SELECT * From Entries EE JOIN Documents DD on ee.DocID = DD.DocID where EE.DTS = @DTS and EE.UserID = @UserID -- <<< Copy RoUsages >>> INSERT INTO [VEPROMS].[dbo].[RoUsages] ([ContentID],[ROID],[Config],[DTS],[UserID],[RODbID]) SELECT NN.[NewContentID],[ROID],[Config],@DTS,@UserID,[RODbID] FROM [RoUsages] RR Join @Children NN on RR.ContentID = NN.ContentID -- RoUsages are done -- SELECT * From RoUsages where DTS = @DTS and UserID = @UserID -- <<< Copy Transtions >>> INSERT INTO [VEPROMS].[dbo].[Transitions] ([FromID],[ToID],[RangeID],[TranType],[Config],[DTS],[UserID]) SELECT NNF.[NewContentID],ISNULL(NNT.[NewItemID],[ToID]),ISNULL(NNR.[NewItemID],[RangeID]),[TranType],[Config],@DTS,@UserID FROM [VEPROMS].[dbo].[Transitions] TT JOIN @Children NNF on TT.[FromID] = NNF.[ContentID] LEFT JOIN @Children NNT on TT.[ToID] = NNT.[ItemID] LEFT JOIN @Children NNR on TT.[RangeID] = NNR.[ItemID] -- Transitions are done -- SELECT * From Transitions where DTS = @DTS and UserID = @UserID --╔═════════════════════════════════════════════════════════════════╗ --║ Rollback to remove any of the changes just made. ║ --╚═════════════════════════════════════════════════════════════════╝ --ROLLBACK -- Reset the data COMMIT --BEGIN TRANSACTION --EXECUTE pasteItemSiblingBefore 230, @NewStartItemID, null, @DTS, @UserID --COMMIT --SELECT ItemID,ContentID,dbo.ve_GetShortPath(ItemID) from vefn_ChildItemsRange(107,108) --SELECT * from Items where ItemID in -- Create new items based upon this list -- Create a list of Old2New ItemID, OldItemID, ContentID, OldContentID -- Use logic for AddItemChild, AddItemSiblingAfter and AddItemSiblingBefore to insert the new structure /* DECLARE @ContentID AS INT DECLARE @NextItemID AS INT DECLARE @PreviousItemID AS INT DECLARE @ExternalChildCount AS INT DECLARE @ExternalCount AS INT DECLARE @Path AS VARCHAR(MAX) DECLARE @Children AS TABLE ( ItemID INT PRIMARY KEY, ContentID INT ) DECLARE @ExternalTrans TABLE ( [FromItemID] int, [TransitionID] [int] NOT NULL, [FromID] [int] NOT NULL, [ToID] [int] NOT NULL, [RangeID] [int] NOT NULL, [Config] [nvarchar](max) NULL ) SET NOCOUNT ON SELECT @ContentID = ContentID, @PreviousItemID = PreviousID FROM Items WHERE ItemID = @ItemID SELECT @NextItemID = ItemID FROM Items WHERE PreviousID = @ItemID SELECT @ExternalCount = count(*) FROM vefn_FindExternalTransitions(@ItemID) SELECT @ExternalChildCount = count(*) FROM vefn_FindExternalChildTransitions(@ItemID) SET @Path = [dbo].[ve_GetShortPath](@ItemID) IF @ExternalCount > 0 AND @NextItemID is null BEGIN RAISERROR ('###Cannot Delete Item###Step %d has External Transitions and has no next step - (%s)',16,1,@ItemID,@Path) RETURN END IF @ExternalChildCount > 0 BEGIN RAISERROR ('###Cannot Delete Item###Step %d has External Transitions to it''s children - (%s)',16,1,@ItemID,@Path) RETURN END -- Get list of Children INSERT INTO @Children SELECT * FROM vefn_ChildItems(@ItemID) -- UPDATE PreviousID in Items WHERE ItemID = @NextItemID UPDATE Items SET PreviousID = @PreviousItemID WHERE ItemID=@NextItemID -- UPDATE DocVersion UPDATE DocVersions SET ItemID=@NextItemID where ItemID = @ItemID -- UPDATE Parts IF @NextItemID is not NULL -- Remove Part Record BEGIN UPDATE PARTS SET ItemID = @NextItemID where ItemID=@ItemID END ELSE BEGIN DELETE FROM Parts WHERE ItemID=@ItemID END -- Get external transitions that point to the specified Item -- These will need to be adjusted to point to the next Item. INSERT INTO @ExternalTrans SELECT * FROM vefn_FindExternalTransitions(@ItemID); DECLARE @typeID int -- AnnotationType SELECT @typeID = TypeID from AnnotationTypes where Name = 'Verification Required' IF(@typeID IS NULL) BEGIN INSERT INTO [AnnotationTypes] ([Name],[UserID]) VALUES ('Verification Required','Volian') SELECT @typeID = SCOPE_IDENTITY() END -- Add 'Verification Required' annotions for transtions that point to different step INSERT INTO [Annotations] ([ItemID],[TypeID],[SearchText],[UserID]) SELECT ItemID, @typeID,'Verify Transition Destination',@UserID FROM Items where ItemID in (SELECT FromItemID FROM @ExternalTrans) -- Update content records for the transitions Update CC Set Text = DBO.vefn_FixTransitionText(Text,TT.TransitionID,TT.TranType,TT.ToID,TT.RangeID,@ItemID,@NextItemID) From CONTENTS CC JOIN Transitions TT ON TT.FromID = CC.ContentID WHERE TransitionID in(Select TransitionID from @ExternalTrans) -- Update transitions that point to @ItemID to Point to @NextItemID UPDATE TRANSITIONS SET ToID = case when ToID = @ItemID then @NextItemID else ToID END, RangeID = case when RangeID = @ItemID then @NextItemID else RangeID END WHERE TransitionID in(Select TransitionID from @ExternalTrans) -- Delete Annotations for @ItemID and children DELETE from Annotations where ItemID in(Select ItemID from @Children) -- Delete Details associated with @ContentID and children DELETE from Details where ContentID in(Select ContentID from @Children) -- Delete Entries associated with @ContentID and children DELETE from Entries where ContentID in(Select ContentID from @Children) -- Delete ROUsages associated with @ContentID and children DELETE from RoUsages where ContentID in(Select ContentID from @Children) -- Delete ZTransitions records associated with @ContentID and children DELETE FROM ZTransitions where TransitionID in(SELECT TransitionID from Transitions where FromID in(SELECT ContentID FROM @Children) or FromID = @ContentID) -- Delete Transitions associated with @ContentID and children DELETE FROM Transitions where FromID in(SELECT ContentID FROM @Children) or FromID = @ContentID -- Delete Parts associated with @ContentID and children DELETE from Parts where ContentID in(Select ContentID from @Children) -- Delete ZContents associated with @ContentID and children DELETE from ZContents where ContentID in(Select ContentID from @Children) -- Disconnect Items from Each Other DELETE from Items where ItemID in(Select ItemID from @Children) and PreviousID Is Not Null -- Disconnect Items to be deleted from each other Update Items set PreviousID = null where ItemID in (Select ItemID from @Children) and PreviousID Is Not Null -- Delete Item Records DELETE from Items where ItemID in(Select ItemID from @Children) -- DELETE Contents DELETE from Contents where ContentID in(Select ContentID from @Children) */ /* IF( @@TRANCOUNT > 0 ) COMMIT END TRY BEGIN CATCH -- Catch Block IF( @@TRANCOUNT = 1 ) ROLLBACK -- Only rollback if top level ELSE IF( @@TRANCOUNT > 1 ) COMMIT -- Otherwise commit. Top level will rollback EXEC vlnErrorHandler END CATCH */ --USE MASTER