1
0
mirror of https://github.com/bitwarden/server.git synced 2024-11-24 12:35:25 +01:00
bitwarden-server/util/Migrator/DbScripts/2024-03-20_00_BulkCipherCollectionAssignment.sql
Shane Melton 6a0f6e1dac
[PM-2383] Bulk collection assignment (#3919)
* [PM-2383] Add bulk add/remove collection cipher repository methods

* [PM-2383] Add additional authorization helpers for CiphersControlle

* [PM-2383] Add /bulk-collections endpoint to CiphersController.cs

* [PM-2383] Add EF implementation for new CollectionCipherRepository methods

* [PM-2383] Ensure V1 logic only applies when the flag is enabled for new bulk functionality
2024-03-22 13:16:34 -07:00

86 lines
2.3 KiB
Transact-SQL

CREATE OR ALTER PROCEDURE [dbo].[CollectionCipher_AddCollectionsForManyCiphers]
@CipherIds AS [dbo].[GuidIdArray] READONLY,
@OrganizationId UNIQUEIDENTIFIER,
@CollectionIds AS [dbo].[GuidIdArray] READONLY
AS
BEGIN
SET NOCOUNT ON
CREATE TABLE #AvailableCollections (
[Id] UNIQUEIDENTIFIER
)
INSERT INTO #AvailableCollections
SELECT
C.[Id]
FROM
[dbo].[Collection] C
INNER JOIN
[dbo].[Organization] O ON O.[Id] = C.[OrganizationId]
WHERE
O.[Id] = @OrganizationId AND O.[Enabled] = 1
IF (SELECT COUNT(1) FROM #AvailableCollections) < 1
BEGIN
-- No collections available
RETURN
END
;WITH [SourceCollectionCipherCTE] AS(
SELECT
[Collection].[Id] AS [CollectionId],
[Cipher].[Id] AS [CipherId]
FROM
@CollectionIds AS [Collection]
CROSS JOIN
@CipherIds AS [Cipher]
WHERE
[Collection].[Id] IN (SELECT [Id] FROM #AvailableCollections)
)
MERGE
[CollectionCipher] AS [Target]
USING
[SourceCollectionCipherCTE] AS [Source]
ON
[Target].[CollectionId] = [Source].[CollectionId]
AND [Target].[CipherId] = [Source].[CipherId]
WHEN NOT MATCHED BY TARGET THEN
INSERT VALUES
(
[Source].[CollectionId],
[Source].[CipherId]
)
;
EXEC [dbo].[User_BumpAccountRevisionDateByOrganizationId] @OrganizationId
END
GO
CREATE OR ALTER PROCEDURE [dbo].[CollectionCipher_RemoveCollectionsForManyCiphers]
@CipherIds AS [dbo].[GuidIdArray] READONLY,
@OrganizationId UNIQUEIDENTIFIER,
@CollectionIds AS [dbo].[GuidIdArray] READONLY
AS
BEGIN
SET NOCOUNT ON
DECLARE @BatchSize INT = 100
WHILE @BatchSize > 0
BEGIN
BEGIN TRANSACTION CollectionCipher_DeleteMany
DELETE TOP(@BatchSize)
FROM
[dbo].[CollectionCipher]
WHERE
[CipherId] IN (SELECT [Id] FROM @CipherIds) AND
[CollectionId] IN (SELECT [Id] FROM @CollectionIds)
SET @BatchSize = @@ROWCOUNT
COMMIT TRANSACTION CollectionCipher_DeleteMany
END
EXEC [dbo].[User_BumpAccountRevisionDateByOrganizationId] @OrganizationId
END
GO