445 lines
25 KiB
Transact-SQL
445 lines
25 KiB
Transact-SQL
SET ANSI_NULLS ON;
|
|
GO
|
|
SET QUOTED_IDENTIFIER ON;
|
|
GO
|
|
|
|
DECLARE @ArchiveTables TABLE (TableName sysname);
|
|
INSERT @ArchiveTables (TableName)
|
|
VALUES
|
|
(N'Projects'), (N'Books'), (N'Chapters'), (N'Scenes'), (N'PlotLines'), (N'PlotThreads'),
|
|
(N'StoryAssets'), (N'Characters'), (N'Locations'), (N'Scenarios'), (N'CharacterRelationships');
|
|
|
|
DECLARE @TableName sysname;
|
|
DECLARE @Sql nvarchar(max);
|
|
DECLARE archive_cursor CURSOR LOCAL FAST_FORWARD FOR SELECT TableName FROM @ArchiveTables;
|
|
OPEN archive_cursor;
|
|
FETCH NEXT FROM archive_cursor INTO @TableName;
|
|
WHILE @@FETCH_STATUS = 0
|
|
BEGIN
|
|
IF COL_LENGTH(N'dbo.' + @TableName, N'IsArchived') IS NULL
|
|
BEGIN
|
|
SET @Sql = N'ALTER TABLE dbo.' + QUOTENAME(@TableName) + N' ADD IsArchived bit NOT NULL CONSTRAINT ' + QUOTENAME(N'DF_' + @TableName + N'_IsArchived_Phase1T') + N' DEFAULT 0;';
|
|
EXEC sys.sp_executesql @Sql;
|
|
END
|
|
|
|
IF COL_LENGTH(N'dbo.' + @TableName, N'ArchivedDate') IS NULL
|
|
BEGIN
|
|
SET @Sql = N'ALTER TABLE dbo.' + QUOTENAME(@TableName) + N' ADD ArchivedDate datetime2 NULL;';
|
|
EXEC sys.sp_executesql @Sql;
|
|
END
|
|
|
|
IF COL_LENGTH(N'dbo.' + @TableName, N'ArchivedReason') IS NULL
|
|
BEGIN
|
|
SET @Sql = N'ALTER TABLE dbo.' + QUOTENAME(@TableName) + N' ADD ArchivedReason nvarchar(500) NULL;';
|
|
EXEC sys.sp_executesql @Sql;
|
|
END
|
|
|
|
FETCH NEXT FROM archive_cursor INTO @TableName;
|
|
END
|
|
CLOSE archive_cursor;
|
|
DEALLOCATE archive_cursor;
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.Archive_List
|
|
@ProjectID int = NULL,
|
|
@EntityType nvarchar(80) = NULL
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
|
|
SELECT EntityType, EntityID, DisplayName, ProjectID, ProjectName, BookID, BookTitle, ArchivedDate, ArchivedReason, UpdatedDate
|
|
FROM
|
|
(
|
|
SELECT N'Project' AS EntityType, p.ProjectID AS EntityID, p.ProjectName AS DisplayName, p.ProjectID, p.ProjectName,
|
|
CAST(NULL AS int) AS BookID, CAST(NULL AS nvarchar(200)) AS BookTitle, p.ArchivedDate, p.ArchivedReason, p.UpdatedDate
|
|
FROM dbo.Projects p
|
|
WHERE p.IsArchived = 1
|
|
|
|
UNION ALL
|
|
SELECT N'Book', b.BookID, b.BookTitle, b.ProjectID, p.ProjectName, b.BookID, b.BookTitle, b.ArchivedDate, b.ArchivedReason, b.UpdatedDate
|
|
FROM dbo.Books b INNER JOIN dbo.Projects p ON p.ProjectID = b.ProjectID
|
|
WHERE b.IsArchived = 1
|
|
|
|
UNION ALL
|
|
SELECT N'Chapter', c.ChapterID, CONCAT(N'Ch ', c.ChapterNumber, N': ', c.ChapterTitle), b.ProjectID, p.ProjectName, b.BookID, b.BookTitle, c.ArchivedDate, c.ArchivedReason, c.UpdatedDate
|
|
FROM dbo.Chapters c INNER JOIN dbo.Books b ON b.BookID = c.BookID INNER JOIN dbo.Projects p ON p.ProjectID = b.ProjectID
|
|
WHERE c.IsArchived = 1
|
|
|
|
UNION ALL
|
|
SELECT N'Scene', s.SceneID, CONCAT(N'Scene ', s.SceneNumber, N': ', s.SceneTitle), b.ProjectID, p.ProjectName, b.BookID, b.BookTitle, s.ArchivedDate, s.ArchivedReason, s.UpdatedDate
|
|
FROM dbo.Scenes s INNER JOIN dbo.Chapters c ON c.ChapterID = s.ChapterID INNER JOIN dbo.Books b ON b.BookID = c.BookID INNER JOIN dbo.Projects p ON p.ProjectID = b.ProjectID
|
|
WHERE s.IsArchived = 1
|
|
|
|
UNION ALL
|
|
SELECT N'PlotLine', pl.PlotLineID, pl.PlotLineName, pl.ProjectID, p.ProjectName, pl.BookID, b.BookTitle, pl.ArchivedDate, pl.ArchivedReason, pl.UpdatedDate
|
|
FROM dbo.PlotLines pl INNER JOIN dbo.Projects p ON p.ProjectID = pl.ProjectID LEFT JOIN dbo.Books b ON b.BookID = pl.BookID
|
|
WHERE pl.IsArchived = 1
|
|
|
|
UNION ALL
|
|
SELECT N'PlotThread', pt.PlotThreadID, pt.ThreadTitle, pl.ProjectID, p.ProjectName, pl.BookID, b.BookTitle, pt.ArchivedDate, pt.ArchivedReason, pt.UpdatedDate
|
|
FROM dbo.PlotThreads pt INNER JOIN dbo.PlotLines pl ON pl.PlotLineID = pt.PlotLineID INNER JOIN dbo.Projects p ON p.ProjectID = pl.ProjectID LEFT JOIN dbo.Books b ON b.BookID = pl.BookID
|
|
WHERE pt.IsArchived = 1
|
|
|
|
UNION ALL
|
|
SELECT N'StoryAsset', sa.StoryAssetID, sa.AssetName, sa.ProjectID, p.ProjectName, CAST(NULL AS int), CAST(NULL AS nvarchar(200)), sa.ArchivedDate, sa.ArchivedReason, sa.UpdatedDate
|
|
FROM dbo.StoryAssets sa INNER JOIN dbo.Projects p ON p.ProjectID = sa.ProjectID
|
|
WHERE sa.IsArchived = 1
|
|
|
|
UNION ALL
|
|
SELECT N'Character', ch.CharacterID, ch.CharacterName, ch.ProjectID, p.ProjectName, CAST(NULL AS int), CAST(NULL AS nvarchar(200)), ch.ArchivedDate, ch.ArchivedReason, ch.UpdatedDate
|
|
FROM dbo.Characters ch INNER JOIN dbo.Projects p ON p.ProjectID = ch.ProjectID
|
|
WHERE ch.IsArchived = 1
|
|
|
|
UNION ALL
|
|
SELECT N'Location', l.LocationID, l.LocationName, l.ProjectID, p.ProjectName, CAST(NULL AS int), CAST(NULL AS nvarchar(200)), l.ArchivedDate, l.ArchivedReason, l.UpdatedDate
|
|
FROM dbo.Locations l INNER JOIN dbo.Projects p ON p.ProjectID = l.ProjectID
|
|
WHERE l.IsArchived = 1
|
|
|
|
UNION ALL
|
|
SELECT N'Scenario', sc.ScenarioID, sc.ScenarioName, sc.ProjectID, p.ProjectName, sc.BookID, b.BookTitle, sc.ArchivedDate, sc.ArchivedReason, sc.UpdatedDate
|
|
FROM dbo.Scenarios sc INNER JOIN dbo.Projects p ON p.ProjectID = sc.ProjectID LEFT JOIN dbo.Books b ON b.BookID = sc.BookID
|
|
WHERE sc.IsArchived = 1
|
|
|
|
UNION ALL
|
|
SELECT N'Relationship', cr.CharacterRelationshipID, CONCAT(ca.CharacterName, N' / ', cb.CharacterName), cr.ProjectID, p.ProjectName, CAST(NULL AS int), CAST(NULL AS nvarchar(200)), cr.ArchivedDate, cr.ArchivedReason, cr.UpdatedDate
|
|
FROM dbo.CharacterRelationships cr INNER JOIN dbo.Projects p ON p.ProjectID = cr.ProjectID INNER JOIN dbo.Characters ca ON ca.CharacterID = cr.CharacterAID INNER JOIN dbo.Characters cb ON cb.CharacterID = cr.CharacterBID
|
|
WHERE cr.IsArchived = 1
|
|
) archived
|
|
WHERE (@ProjectID IS NULL OR archived.ProjectID = @ProjectID)
|
|
AND (@EntityType IS NULL OR archived.EntityType = @EntityType)
|
|
ORDER BY ISNULL(ArchivedDate, UpdatedDate) DESC, EntityType, DisplayName;
|
|
END;
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.Archive_Entity
|
|
@EntityType nvarchar(80),
|
|
@EntityID int,
|
|
@ArchivedReason nvarchar(500) = NULL
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
|
|
IF @EntityType = N'Project' UPDATE dbo.Projects SET IsArchived = 1, ArchivedDate = SYSUTCDATETIME(), ArchivedReason = @ArchivedReason, UpdatedDate = SYSUTCDATETIME() WHERE ProjectID = @EntityID;
|
|
ELSE IF @EntityType = N'Book' UPDATE dbo.Books SET IsArchived = 1, ArchivedDate = SYSUTCDATETIME(), ArchivedReason = @ArchivedReason, UpdatedDate = SYSUTCDATETIME() WHERE BookID = @EntityID;
|
|
ELSE IF @EntityType = N'Chapter' UPDATE dbo.Chapters SET IsArchived = 1, ArchivedDate = SYSUTCDATETIME(), ArchivedReason = @ArchivedReason, UpdatedDate = SYSUTCDATETIME() WHERE ChapterID = @EntityID;
|
|
ELSE IF @EntityType = N'Scene' UPDATE dbo.Scenes SET IsArchived = 1, ArchivedDate = SYSUTCDATETIME(), ArchivedReason = @ArchivedReason, UpdatedDate = SYSUTCDATETIME() WHERE SceneID = @EntityID;
|
|
ELSE IF @EntityType = N'PlotLine' UPDATE dbo.PlotLines SET IsArchived = 1, ArchivedDate = SYSUTCDATETIME(), ArchivedReason = @ArchivedReason, UpdatedDate = SYSUTCDATETIME() WHERE PlotLineID = @EntityID;
|
|
ELSE IF @EntityType = N'PlotThread' UPDATE dbo.PlotThreads SET IsArchived = 1, ArchivedDate = SYSUTCDATETIME(), ArchivedReason = @ArchivedReason, UpdatedDate = SYSUTCDATETIME() WHERE PlotThreadID = @EntityID;
|
|
ELSE IF @EntityType = N'StoryAsset' UPDATE dbo.StoryAssets SET IsArchived = 1, ArchivedDate = SYSUTCDATETIME(), ArchivedReason = @ArchivedReason, UpdatedDate = SYSUTCDATETIME() WHERE StoryAssetID = @EntityID;
|
|
ELSE IF @EntityType = N'Character' UPDATE dbo.Characters SET IsArchived = 1, ArchivedDate = SYSUTCDATETIME(), ArchivedReason = @ArchivedReason, UpdatedDate = SYSUTCDATETIME() WHERE CharacterID = @EntityID;
|
|
ELSE IF @EntityType = N'Location' UPDATE dbo.Locations SET IsArchived = 1, ArchivedDate = SYSUTCDATETIME(), ArchivedReason = @ArchivedReason, UpdatedDate = SYSUTCDATETIME() WHERE LocationID = @EntityID;
|
|
ELSE IF @EntityType = N'Scenario' UPDATE dbo.Scenarios SET IsArchived = 1, ArchivedDate = SYSUTCDATETIME(), ArchivedReason = @ArchivedReason, UpdatedDate = SYSUTCDATETIME() WHERE ScenarioID = @EntityID;
|
|
ELSE IF @EntityType = N'Relationship' UPDATE dbo.CharacterRelationships SET IsArchived = 1, ArchivedDate = SYSUTCDATETIME(), ArchivedReason = @ArchivedReason, UpdatedDate = SYSUTCDATETIME() WHERE CharacterRelationshipID = @EntityID;
|
|
END;
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.Archive_Restore
|
|
@EntityType nvarchar(80),
|
|
@EntityID int
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
|
|
IF @EntityType = N'Project' UPDATE dbo.Projects SET IsArchived = 0, ArchivedDate = NULL, ArchivedReason = NULL, UpdatedDate = SYSUTCDATETIME() WHERE ProjectID = @EntityID;
|
|
ELSE IF @EntityType = N'Book' UPDATE dbo.Books SET IsArchived = 0, ArchivedDate = NULL, ArchivedReason = NULL, UpdatedDate = SYSUTCDATETIME() WHERE BookID = @EntityID;
|
|
ELSE IF @EntityType = N'Chapter' UPDATE dbo.Chapters SET IsArchived = 0, ArchivedDate = NULL, ArchivedReason = NULL, UpdatedDate = SYSUTCDATETIME() WHERE ChapterID = @EntityID;
|
|
ELSE IF @EntityType = N'Scene' UPDATE dbo.Scenes SET IsArchived = 0, ArchivedDate = NULL, ArchivedReason = NULL, UpdatedDate = SYSUTCDATETIME() WHERE SceneID = @EntityID;
|
|
ELSE IF @EntityType = N'PlotLine' UPDATE dbo.PlotLines SET IsArchived = 0, ArchivedDate = NULL, ArchivedReason = NULL, UpdatedDate = SYSUTCDATETIME() WHERE PlotLineID = @EntityID;
|
|
ELSE IF @EntityType = N'PlotThread' UPDATE dbo.PlotThreads SET IsArchived = 0, ArchivedDate = NULL, ArchivedReason = NULL, UpdatedDate = SYSUTCDATETIME() WHERE PlotThreadID = @EntityID;
|
|
ELSE IF @EntityType = N'StoryAsset' UPDATE dbo.StoryAssets SET IsArchived = 0, ArchivedDate = NULL, ArchivedReason = NULL, UpdatedDate = SYSUTCDATETIME() WHERE StoryAssetID = @EntityID;
|
|
ELSE IF @EntityType = N'Character' UPDATE dbo.Characters SET IsArchived = 0, ArchivedDate = NULL, ArchivedReason = NULL, UpdatedDate = SYSUTCDATETIME() WHERE CharacterID = @EntityID;
|
|
ELSE IF @EntityType = N'Location' UPDATE dbo.Locations SET IsArchived = 0, ArchivedDate = NULL, ArchivedReason = NULL, UpdatedDate = SYSUTCDATETIME() WHERE LocationID = @EntityID;
|
|
ELSE IF @EntityType = N'Scenario' UPDATE dbo.Scenarios SET IsArchived = 0, ArchivedDate = NULL, ArchivedReason = NULL, UpdatedDate = SYSUTCDATETIME() WHERE ScenarioID = @EntityID;
|
|
ELSE IF @EntityType = N'Relationship' UPDATE dbo.CharacterRelationships SET IsArchived = 0, ArchivedDate = NULL, ArchivedReason = NULL, UpdatedDate = SYSUTCDATETIME() WHERE CharacterRelationshipID = @EntityID;
|
|
END;
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.Archive_ProjectFilterList
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
|
|
SELECT ProjectID, ProjectName, Description, CreatedDate, UpdatedDate, IsArchived
|
|
FROM dbo.Projects
|
|
ORDER BY IsArchived, ProjectName;
|
|
END;
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.Archive_DeleteForever
|
|
@EntityType nvarchar(80),
|
|
@EntityID int,
|
|
@ConfirmationText nvarchar(20)
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
|
|
IF UPPER(LTRIM(RTRIM(ISNULL(@ConfirmationText, N'')))) <> N'DELETE'
|
|
BEGIN
|
|
SELECT CAST(0 AS bit) AS Succeeded, N'Type DELETE to permanently delete an archived item.' AS Message;
|
|
RETURN;
|
|
END;
|
|
|
|
DECLARE @HasLinks bit = 0;
|
|
DECLARE @IsArchived bit = 0;
|
|
|
|
IF @EntityType = N'Project'
|
|
BEGIN
|
|
SELECT @IsArchived = IsArchived FROM dbo.Projects WHERE ProjectID = @EntityID;
|
|
IF EXISTS (
|
|
SELECT 1 FROM dbo.Books WHERE ProjectID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.PlotLines WHERE ProjectID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.StoryAssets WHERE ProjectID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.Characters WHERE ProjectID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.Locations WHERE ProjectID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.Scenarios WHERE ProjectID = @EntityID
|
|
) SET @HasLinks = 1;
|
|
IF @IsArchived = 1 AND @HasLinks = 0 DELETE FROM dbo.Projects WHERE ProjectID = @EntityID;
|
|
END
|
|
ELSE IF @EntityType = N'Book'
|
|
BEGIN
|
|
SELECT @IsArchived = IsArchived FROM dbo.Books WHERE BookID = @EntityID;
|
|
IF EXISTS (
|
|
SELECT 1 FROM dbo.Chapters WHERE BookID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.PlotLines WHERE BookID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.Scenarios WHERE BookID = @EntityID
|
|
) SET @HasLinks = 1;
|
|
IF @IsArchived = 1 AND @HasLinks = 0 DELETE FROM dbo.Books WHERE BookID = @EntityID;
|
|
END
|
|
ELSE IF @EntityType = N'Chapter'
|
|
BEGIN
|
|
SELECT @IsArchived = IsArchived FROM dbo.Chapters WHERE ChapterID = @EntityID;
|
|
IF EXISTS (SELECT 1 FROM dbo.Scenes WHERE ChapterID = @EntityID) SET @HasLinks = 1;
|
|
IF @IsArchived = 1 AND @HasLinks = 0 DELETE FROM dbo.Chapters WHERE ChapterID = @EntityID;
|
|
END
|
|
ELSE IF @EntityType = N'Scene'
|
|
BEGIN
|
|
SELECT @IsArchived = IsArchived FROM dbo.Scenes WHERE SceneID = @EntityID;
|
|
IF EXISTS (
|
|
SELECT 1 FROM dbo.ScenePurposes WHERE SceneID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.SceneMetricValues WHERE SceneID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.ThreadEvents WHERE SceneID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.AssetEvents WHERE SceneID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.SceneCharacters WHERE SceneID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.CharacterKnowledge WHERE SceneID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.RelationshipEvents WHERE SceneID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.SceneNotes WHERE SceneID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.SceneChecklistItems WHERE SceneID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.SceneAttachments WHERE SceneID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.ScenarioSceneOrder WHERE SceneID = @EntityID
|
|
) SET @HasLinks = 1;
|
|
IF @IsArchived = 1 AND @HasLinks = 0 DELETE FROM dbo.Scenes WHERE SceneID = @EntityID;
|
|
END
|
|
ELSE IF @EntityType = N'PlotLine'
|
|
BEGIN
|
|
SELECT @IsArchived = IsArchived FROM dbo.PlotLines WHERE PlotLineID = @EntityID;
|
|
IF EXISTS (SELECT 1 FROM dbo.PlotThreads WHERE PlotLineID = @EntityID) SET @HasLinks = 1;
|
|
IF @IsArchived = 1 AND @HasLinks = 0 DELETE FROM dbo.PlotLines WHERE PlotLineID = @EntityID;
|
|
END
|
|
ELSE IF @EntityType = N'PlotThread'
|
|
BEGIN
|
|
SELECT @IsArchived = IsArchived FROM dbo.PlotThreads WHERE PlotThreadID = @EntityID;
|
|
IF EXISTS (
|
|
SELECT 1 FROM dbo.ThreadEvents WHERE PlotThreadID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.CharacterKnowledge WHERE PlotThreadID = @EntityID
|
|
) SET @HasLinks = 1;
|
|
IF @IsArchived = 1 AND @HasLinks = 0 DELETE FROM dbo.PlotThreads WHERE PlotThreadID = @EntityID;
|
|
END
|
|
ELSE IF @EntityType = N'StoryAsset'
|
|
BEGIN
|
|
SELECT @IsArchived = IsArchived FROM dbo.StoryAssets WHERE StoryAssetID = @EntityID;
|
|
IF EXISTS (
|
|
SELECT 1 FROM dbo.AssetEvents WHERE StoryAssetID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.AssetDependencies WHERE SourceAssetID = @EntityID OR TargetAssetID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.AssetCustodyEvents WHERE StoryAssetID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.CharacterKnowledge WHERE StoryAssetID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.SceneAssetLocations WHERE StoryAssetID = @EntityID
|
|
) SET @HasLinks = 1;
|
|
IF @IsArchived = 1 AND @HasLinks = 0 DELETE FROM dbo.StoryAssets WHERE StoryAssetID = @EntityID;
|
|
END
|
|
ELSE IF @EntityType = N'Character'
|
|
BEGIN
|
|
SELECT @IsArchived = IsArchived FROM dbo.Characters WHERE CharacterID = @EntityID;
|
|
IF EXISTS (
|
|
SELECT 1 FROM dbo.SceneCharacters WHERE CharacterID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.CharacterAttributeEvents WHERE CharacterID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.CharacterKnowledge WHERE CharacterID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.CharacterRelationships WHERE CharacterAID = @EntityID OR CharacterBID = @EntityID
|
|
) SET @HasLinks = 1;
|
|
IF @IsArchived = 1 AND @HasLinks = 0 DELETE FROM dbo.Characters WHERE CharacterID = @EntityID;
|
|
END
|
|
ELSE IF @EntityType = N'Location'
|
|
BEGIN
|
|
SELECT @IsArchived = IsArchived FROM dbo.Locations WHERE LocationID = @EntityID;
|
|
IF EXISTS (
|
|
SELECT 1 FROM dbo.Locations WHERE ParentLocationID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.Scenes WHERE PrimaryLocationID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.SceneCharacters WHERE LocationID = @EntityID OR EntryLocationID = @EntityID OR ExitLocationID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.StoryAssets WHERE CurrentLocationID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.SceneAssetLocations WHERE LocationID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.LocationRelationships WHERE FromLocationID = @EntityID OR ToLocationID = @EntityID
|
|
) SET @HasLinks = 1;
|
|
IF @IsArchived = 1 AND @HasLinks = 0 DELETE FROM dbo.Locations WHERE LocationID = @EntityID;
|
|
END
|
|
ELSE IF @EntityType = N'Scenario'
|
|
BEGIN
|
|
SELECT @IsArchived = IsArchived FROM dbo.Scenarios WHERE ScenarioID = @EntityID;
|
|
IF EXISTS (
|
|
SELECT 1 FROM dbo.ScenarioSceneOrder WHERE ScenarioID = @EntityID
|
|
UNION ALL SELECT 1 FROM dbo.ScenarioWarnings WHERE ScenarioID = @EntityID
|
|
) SET @HasLinks = 1;
|
|
IF @IsArchived = 1 AND @HasLinks = 0 DELETE FROM dbo.Scenarios WHERE ScenarioID = @EntityID;
|
|
END
|
|
ELSE IF @EntityType = N'Relationship'
|
|
BEGIN
|
|
SELECT @IsArchived = IsArchived FROM dbo.CharacterRelationships WHERE CharacterRelationshipID = @EntityID;
|
|
IF EXISTS (SELECT 1 FROM dbo.RelationshipEvents WHERE CharacterRelationshipID = @EntityID) SET @HasLinks = 1;
|
|
IF @IsArchived = 1 AND @HasLinks = 0 DELETE FROM dbo.CharacterRelationships WHERE CharacterRelationshipID = @EntityID;
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
SELECT CAST(0 AS bit) AS Succeeded, N'This archived item type is not supported for permanent delete.' AS Message;
|
|
RETURN;
|
|
END;
|
|
|
|
IF ISNULL(@IsArchived, 0) = 0
|
|
BEGIN
|
|
SELECT CAST(0 AS bit) AS Succeeded, N'Only archived items can be permanently deleted.' AS Message;
|
|
RETURN;
|
|
END;
|
|
|
|
IF @HasLinks = 1
|
|
BEGIN
|
|
SELECT CAST(0 AS bit) AS Succeeded, N'This item has linked story data and cannot yet be permanently deleted safely. Leave it archived instead.' AS Message;
|
|
RETURN;
|
|
END;
|
|
|
|
SELECT CAST(1 AS bit) AS Succeeded, N'Archived item permanently deleted.' AS Message;
|
|
END;
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.Project_Archive @ProjectID int AS BEGIN SET NOCOUNT ON; EXEC dbo.Archive_Entity N'Project', @ProjectID, NULL; END;
|
|
GO
|
|
CREATE OR ALTER PROCEDURE dbo.Book_Archive @BookID int AS BEGIN SET NOCOUNT ON; EXEC dbo.Archive_Entity N'Book', @BookID, NULL; END;
|
|
GO
|
|
CREATE OR ALTER PROCEDURE dbo.Chapter_Archive @ChapterID int AS BEGIN SET NOCOUNT ON; EXEC dbo.Archive_Entity N'Chapter', @ChapterID, NULL; END;
|
|
GO
|
|
CREATE OR ALTER PROCEDURE dbo.Scene_Archive @SceneID int AS BEGIN SET NOCOUNT ON; EXEC dbo.Archive_Entity N'Scene', @SceneID, NULL; END;
|
|
GO
|
|
CREATE OR ALTER PROCEDURE dbo.PlotLine_Archive @PlotLineID int AS BEGIN SET NOCOUNT ON; EXEC dbo.Archive_Entity N'PlotLine', @PlotLineID, NULL; END;
|
|
GO
|
|
CREATE OR ALTER PROCEDURE dbo.PlotThread_Archive @PlotThreadID int AS BEGIN SET NOCOUNT ON; EXEC dbo.Archive_Entity N'PlotThread', @PlotThreadID, NULL; END;
|
|
GO
|
|
CREATE OR ALTER PROCEDURE dbo.StoryAsset_Archive @StoryAssetID int AS BEGIN SET NOCOUNT ON; EXEC dbo.Archive_Entity N'StoryAsset', @StoryAssetID, NULL; END;
|
|
GO
|
|
CREATE OR ALTER PROCEDURE dbo.Character_Archive @CharacterID int AS BEGIN SET NOCOUNT ON; EXEC dbo.Archive_Entity N'Character', @CharacterID, NULL; END;
|
|
GO
|
|
CREATE OR ALTER PROCEDURE dbo.Location_Archive @LocationID int AS BEGIN SET NOCOUNT ON; EXEC dbo.Archive_Entity N'Location', @LocationID, NULL; END;
|
|
GO
|
|
CREATE OR ALTER PROCEDURE dbo.Scenario_Archive @ScenarioID int AS BEGIN SET NOCOUNT ON; EXEC dbo.Archive_Entity N'Scenario', @ScenarioID, NULL; END;
|
|
GO
|
|
CREATE OR ALTER PROCEDURE dbo.Relationship_Archive @CharacterRelationshipID int AS BEGIN SET NOCOUNT ON; EXEC dbo.Archive_Entity N'Relationship', @CharacterRelationshipID, NULL; END;
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.SceneCharacter_ListByScene
|
|
@SceneID int
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SELECT sc.SceneCharacterID, sc.SceneID, sc.CharacterID, c.ProjectID,
|
|
CASE WHEN c.IsArchived = 1 THEN CONCAT(c.CharacterName, N' (archived)') ELSE c.CharacterName END AS CharacterName,
|
|
c.ShortName, c.BirthDate, c.AgeAtSeriesStart,
|
|
sc.RoleInSceneTypeID, role.TypeName AS RoleInSceneTypeName, sc.PresenceTypeID, presence.TypeName AS PresenceTypeName,
|
|
sc.AppearanceNotes, sc.OutfitDescription, sc.PhysicalCondition, sc.EmotionalState, sc.KnowledgeNotes,
|
|
sc.CreatedDate, sc.UpdatedDate
|
|
FROM dbo.SceneCharacters sc
|
|
INNER JOIN dbo.Characters c ON c.CharacterID = sc.CharacterID
|
|
LEFT JOIN dbo.CharacterRoleInSceneTypes role ON role.CharacterRoleInSceneTypeID = sc.RoleInSceneTypeID
|
|
LEFT JOIN dbo.PresenceTypes presence ON presence.PresenceTypeID = sc.PresenceTypeID
|
|
WHERE sc.SceneID = @SceneID
|
|
ORDER BY role.SortOrder, c.CharacterName;
|
|
END;
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.ThreadEvent_ListByScene
|
|
@SceneID int
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SELECT te.ThreadEventID, te.PlotThreadID,
|
|
CASE WHEN pt.IsArchived = 1 THEN CONCAT(pt.ThreadTitle, N' (archived)') ELSE pt.ThreadTitle END AS ThreadTitle,
|
|
pt.PlotLineID,
|
|
CASE WHEN pl.IsArchived = 1 THEN CONCAT(pl.PlotLineName, N' (archived)') ELSE pl.PlotLineName END AS PlotLineName,
|
|
pl.Colour, te.SceneID, te.EventTypeID, tet.TypeName AS EventTypeName, tet.MarkerText, te.EventTitle,
|
|
te.EventDescription, te.CreatedDate, te.UpdatedDate
|
|
FROM dbo.ThreadEvents te
|
|
INNER JOIN dbo.PlotThreads pt ON pt.PlotThreadID = te.PlotThreadID
|
|
INNER JOIN dbo.PlotLines pl ON pl.PlotLineID = pt.PlotLineID
|
|
INNER JOIN dbo.ThreadEventTypes tet ON tet.ThreadEventTypeID = te.EventTypeID
|
|
WHERE te.SceneID = @SceneID
|
|
ORDER BY pl.SortOrder, pt.Importance DESC, te.CreatedDate;
|
|
END;
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.AssetEvent_ListByScene
|
|
@SceneID int
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SELECT ae.AssetEventID, ae.StoryAssetID, sa.ProjectID,
|
|
CASE WHEN sa.IsArchived = 1 THEN CONCAT(sa.AssetName, N' (archived)') ELSE sa.AssetName END AS AssetName,
|
|
sa.AssetKindID, ak.KindName,
|
|
ae.SceneID, ae.AssetEventTypeID, aet.TypeName AS AssetEventTypeName, aet.MarkerText,
|
|
ae.FromStateID, fs.StateName AS FromStateName, ae.ToStateID, ts.StateName AS ToStateName,
|
|
ae.EventTitle, ae.EventDescription, ae.CreatedDate, ae.UpdatedDate
|
|
FROM dbo.AssetEvents ae
|
|
INNER JOIN dbo.StoryAssets sa ON sa.StoryAssetID = ae.StoryAssetID
|
|
INNER JOIN dbo.AssetKinds ak ON ak.AssetKindID = sa.AssetKindID
|
|
INNER JOIN dbo.AssetEventTypes aet ON aet.AssetEventTypeID = ae.AssetEventTypeID
|
|
LEFT JOIN dbo.AssetStates fs ON fs.AssetStateID = ae.FromStateID
|
|
LEFT JOIN dbo.AssetStates ts ON ts.AssetStateID = ae.ToStateID
|
|
WHERE ae.SceneID = @SceneID
|
|
ORDER BY sa.AssetName, ae.AssetEventID;
|
|
END;
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.RelationshipEvent_ListByScene
|
|
@SceneID int
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SELECT re.RelationshipEventID, re.CharacterRelationshipID, cr.ProjectID, cr.CharacterAID,
|
|
CASE WHEN ca.IsArchived = 1 THEN CONCAT(ca.CharacterName, N' (archived)') ELSE ca.CharacterName END AS CharacterAName,
|
|
cr.CharacterBID,
|
|
CASE WHEN cb.IsArchived = 1 THEN CONCAT(cb.CharacterName, N' (archived)') ELSE cb.CharacterName END AS CharacterBName,
|
|
CASE WHEN cr.IsArchived = 1 THEN CONCAT(rt.TypeName, N' (archived)') ELSE rt.TypeName END AS RelationshipTypeName,
|
|
re.SceneID, re.RelationshipStateID, rs.StateName AS RelationshipStateName, re.Intensity, re.IsKnownToOtherCharacter,
|
|
re.Description, re.CreatedDate, re.UpdatedDate
|
|
FROM dbo.RelationshipEvents re
|
|
INNER JOIN dbo.CharacterRelationships cr ON cr.CharacterRelationshipID = re.CharacterRelationshipID
|
|
INNER JOIN dbo.Characters ca ON ca.CharacterID = cr.CharacterAID
|
|
INNER JOIN dbo.Characters cb ON cb.CharacterID = cr.CharacterBID
|
|
INNER JOIN dbo.RelationshipTypes rt ON rt.RelationshipTypeID = cr.RelationshipTypeID
|
|
INNER JOIN dbo.RelationshipStates rs ON rs.RelationshipStateID = re.RelationshipStateID
|
|
WHERE re.SceneID = @SceneID
|
|
ORDER BY ca.CharacterName, cb.CharacterName;
|
|
END;
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.CharacterKnowledge_Delete
|
|
@CharacterKnowledgeID int
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
DELETE FROM dbo.CharacterKnowledge WHERE CharacterKnowledgeID = @CharacterKnowledgeID;
|
|
END;
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.RelationshipEvent_Delete
|
|
@RelationshipEventID int
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
DELETE FROM dbo.RelationshipEvents WHERE RelationshipEventID = @RelationshipEventID;
|
|
END;
|
|
GO
|