diff --git a/src/Sql/dbo/Stored Procedures/Cipher_Restore.sql b/src/Sql/dbo/Stored Procedures/Cipher_Restore.sql index ab646b46c..3d7cf7ff2 100644 --- a/src/Sql/dbo/Stored Procedures/Cipher_Restore.sql +++ b/src/Sql/dbo/Stored Procedures/Cipher_Restore.sql @@ -21,8 +21,9 @@ BEGIN [dbo].[UserCipherDetails](@UserId) WHERE [Edit] = 1 + AND [DeletedDate] IS NOT NULL AND [Id] IN (SELECT * FROM @Ids) - + DECLARE @UtcNow DATETIME2(7) = GETUTCDATE(); UPDATE [dbo].[Cipher] diff --git a/src/Sql/dbo/Stored Procedures/Cipher_SoftDelete.sql b/src/Sql/dbo/Stored Procedures/Cipher_SoftDelete.sql index 9e2b16bd8..0e354f13e 100644 --- a/src/Sql/dbo/Stored Procedures/Cipher_SoftDelete.sql +++ b/src/Sql/dbo/Stored Procedures/Cipher_SoftDelete.sql @@ -21,6 +21,7 @@ BEGIN [dbo].[UserCipherDetails](@UserId) WHERE [Edit] = 1 + AND [DeletedDate] IS NULL AND [Id] IN (SELECT * FROM @Ids) -- Delete ciphers diff --git a/util/Migrator/DbScripts/2020-04-09_00_CipherSoftDelete.sql b/util/Migrator/DbScripts/2020-04-09_00_CipherSoftDelete.sql new file mode 100644 index 000000000..debf20467 --- /dev/null +++ b/util/Migrator/DbScripts/2020-04-09_00_CipherSoftDelete.sql @@ -0,0 +1,136 @@ +/** + * Fix bulk Restore/Soft Delete sprocs for DateTime assignment + */ +IF OBJECT_ID('[dbo].[Cipher_Restore]') IS NOT NULL +BEGIN + DROP PROCEDURE [dbo].[Cipher_Restore]; +END +GO +CREATE PROCEDURE [dbo].[Cipher_Restore] + @Ids AS [dbo].[GuidIdArray] READONLY, + @UserId AS UNIQUEIDENTIFIER +AS +BEGIN + SET NOCOUNT ON + + CREATE TABLE #Temp + ( + [Id] UNIQUEIDENTIFIER NOT NULL, + [UserId] UNIQUEIDENTIFIER NULL, + [OrganizationId] UNIQUEIDENTIFIER NULL + ) + + INSERT INTO #Temp + SELECT + [Id], + [UserId], + [OrganizationId] + FROM + [dbo].[UserCipherDetails](@UserId) + WHERE + [Edit] = 1 + AND [DeletedDate] IS NOT NULL + AND [Id] IN (SELECT * FROM @Ids) + + DECLARE @UtcNow DATETIME2(7) = GETUTCDATE(); + UPDATE + [dbo].[Cipher] + SET + [DeletedDate] = NULL, + [RevisionDate] = @UtcNow + WHERE + [Id] IN (SELECT [Id] FROM #Temp) + + -- Bump orgs + DECLARE @OrgId UNIQUEIDENTIFIER + DECLARE [OrgCursor] CURSOR FORWARD_ONLY FOR + SELECT + [OrganizationId] + FROM + #Temp + WHERE + [OrganizationId] IS NOT NULL + GROUP BY + [OrganizationId] + OPEN [OrgCursor] + FETCH NEXT FROM [OrgCursor] INTO @OrgId + WHILE @@FETCH_STATUS = 0 BEGIN + EXEC [dbo].[User_BumpAccountRevisionDateByOrganizationId] @OrgId + FETCH NEXT FROM [OrgCursor] INTO @OrgId + END + CLOSE [OrgCursor] + DEALLOCATE [OrgCursor] + + -- Bump user + EXEC [dbo].[User_BumpAccountRevisionDate] @UserId + + DROP TABLE #Temp +END +GO + +IF OBJECT_ID('[dbo].[Cipher_SoftDelete]') IS NOT NULL +BEGIN + DROP PROCEDURE [dbo].[Cipher_SoftDelete]; +END +GO +CREATE PROCEDURE [dbo].[Cipher_SoftDelete] + @Ids AS [dbo].[GuidIdArray] READONLY, + @UserId AS UNIQUEIDENTIFIER +AS +BEGIN + SET NOCOUNT ON + + CREATE TABLE #Temp + ( + [Id] UNIQUEIDENTIFIER NOT NULL, + [UserId] UNIQUEIDENTIFIER NULL, + [OrganizationId] UNIQUEIDENTIFIER NULL + ) + + INSERT INTO #Temp + SELECT + [Id], + [UserId], + [OrganizationId] + FROM + [dbo].[UserCipherDetails](@UserId) + WHERE + [Edit] = 1 + AND [DeletedDate] IS NULL + AND [Id] IN (SELECT * FROM @Ids) + + -- Delete ciphers + DECLARE @UtcNow DATETIME2(7) = GETUTCDATE(); + UPDATE + [dbo].[Cipher] + SET + [DeletedDate] = @UtcNow, + [RevisionDate] = @UtcNow + WHERE + [Id] IN (SELECT [Id] FROM #Temp) + + -- Cleanup orgs + DECLARE @OrgId UNIQUEIDENTIFIER + DECLARE [OrgCursor] CURSOR FORWARD_ONLY FOR + SELECT + [OrganizationId] + FROM + #Temp + WHERE + [OrganizationId] IS NOT NULL + GROUP BY + [OrganizationId] + OPEN [OrgCursor] + FETCH NEXT FROM [OrgCursor] INTO @OrgId + WHILE @@FETCH_STATUS = 0 BEGIN + EXEC [dbo].[User_BumpAccountRevisionDateByOrganizationId] @OrgId + FETCH NEXT FROM [OrgCursor] INTO @OrgId + END + CLOSE [OrgCursor] + DEALLOCATE [OrgCursor] + + EXEC [dbo].[User_BumpAccountRevisionDate] @UserId + + DROP TABLE #Temp +END +GO \ No newline at end of file