284 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			Transact-SQL
		
	
	
	
	
	
			
		
		
	
	
			284 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			Transact-SQL
		
	
	
	
	
	
--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 |