mirror of
https://github.com/bitwarden/server
synced 2026-02-15 07:55:18 +00:00
Explicit transaction for mssql
This commit is contained in:
@@ -28,59 +28,72 @@ BEGIN
|
||||
FROM
|
||||
OPENJSON(@OrganizationUserIdsJson);
|
||||
|
||||
-- Insert semaphore entries first to obtain the "lock"
|
||||
INSERT INTO [dbo].[DefaultCollectionSemaphore]
|
||||
(
|
||||
[OrganizationId],
|
||||
[OrganizationUserId],
|
||||
[CreationDate]
|
||||
)
|
||||
SELECT
|
||||
@OrganizationId,
|
||||
ou.[OrganizationUserId],
|
||||
GETUTCDATE()
|
||||
FROM
|
||||
@OrganizationUserIds ou;
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
-- Insert collections for users who obtained semaphore entries
|
||||
INSERT INTO [dbo].[Collection]
|
||||
(
|
||||
[Id],
|
||||
[OrganizationId],
|
||||
[Name],
|
||||
[CreationDate],
|
||||
[RevisionDate],
|
||||
[Type],
|
||||
[ExternalId],
|
||||
[DefaultUserCollectionEmail]
|
||||
)
|
||||
SELECT
|
||||
ou.[CollectionId],
|
||||
@OrganizationId,
|
||||
@DefaultCollectionName,
|
||||
GETUTCDATE(),
|
||||
GETUTCDATE(),
|
||||
1, -- CollectionType.DefaultUserCollection
|
||||
NULL,
|
||||
NULL
|
||||
FROM
|
||||
@OrganizationUserIds ou;
|
||||
BEGIN TRY
|
||||
-- Insert semaphore entries first to obtain the "lock"
|
||||
-- If this fails due to duplicate key, the entire transaction will be rolled back
|
||||
INSERT INTO [dbo].[DefaultCollectionSemaphore]
|
||||
(
|
||||
[OrganizationId],
|
||||
[OrganizationUserId],
|
||||
[CreationDate]
|
||||
)
|
||||
SELECT
|
||||
@OrganizationId,
|
||||
ou.[OrganizationUserId],
|
||||
GETUTCDATE()
|
||||
FROM
|
||||
@OrganizationUserIds ou;
|
||||
|
||||
-- Insert collection user mappings
|
||||
INSERT INTO [dbo].[CollectionUser]
|
||||
(
|
||||
[CollectionId],
|
||||
[OrganizationUserId],
|
||||
[ReadOnly],
|
||||
[HidePasswords],
|
||||
[Manage]
|
||||
)
|
||||
SELECT
|
||||
ou.[CollectionId],
|
||||
ou.[OrganizationUserId],
|
||||
0, -- ReadOnly = false
|
||||
0, -- HidePasswords = false
|
||||
1 -- Manage = true
|
||||
FROM
|
||||
@OrganizationUserIds ou;
|
||||
-- Insert collections for users who obtained semaphore entries
|
||||
INSERT INTO [dbo].[Collection]
|
||||
(
|
||||
[Id],
|
||||
[OrganizationId],
|
||||
[Name],
|
||||
[CreationDate],
|
||||
[RevisionDate],
|
||||
[Type],
|
||||
[ExternalId],
|
||||
[DefaultUserCollectionEmail]
|
||||
)
|
||||
SELECT
|
||||
ou.[CollectionId],
|
||||
@OrganizationId,
|
||||
@DefaultCollectionName,
|
||||
GETUTCDATE(),
|
||||
GETUTCDATE(),
|
||||
1, -- CollectionType.DefaultUserCollection
|
||||
NULL,
|
||||
NULL
|
||||
FROM
|
||||
@OrganizationUserIds ou;
|
||||
|
||||
-- Insert collection user mappings
|
||||
INSERT INTO [dbo].[CollectionUser]
|
||||
(
|
||||
[CollectionId],
|
||||
[OrganizationUserId],
|
||||
[ReadOnly],
|
||||
[HidePasswords],
|
||||
[Manage]
|
||||
)
|
||||
SELECT
|
||||
ou.[CollectionId],
|
||||
ou.[OrganizationUserId],
|
||||
0, -- ReadOnly = false
|
||||
0, -- HidePasswords = false
|
||||
1 -- Manage = true
|
||||
FROM
|
||||
@OrganizationUserIds ou;
|
||||
|
||||
COMMIT TRANSACTION;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
IF @@TRANCOUNT > 0
|
||||
ROLLBACK TRANSACTION;
|
||||
|
||||
THROW;
|
||||
END CATCH
|
||||
END
|
||||
|
||||
@@ -92,7 +92,7 @@ public class CreateDefaultCollectionsTests
|
||||
collectionRepository.CreateDefaultCollectionsAsync(
|
||||
organization.Id,
|
||||
[orgUser.Id],
|
||||
"My Items"));
|
||||
"My Items Duplicate"));
|
||||
|
||||
// Assert - Only one collection should exist
|
||||
var collections = await collectionRepository.GetManyByOrganizationIdAsync(organization.Id);
|
||||
|
||||
@@ -24,60 +24,73 @@ BEGIN
|
||||
FROM
|
||||
OPENJSON(@OrganizationUserIdsJson);
|
||||
|
||||
-- Insert semaphore entries first to obtain the "lock"
|
||||
INSERT INTO [dbo].[DefaultCollectionSemaphore]
|
||||
(
|
||||
[OrganizationId],
|
||||
[OrganizationUserId],
|
||||
[CreationDate]
|
||||
)
|
||||
SELECT
|
||||
@OrganizationId,
|
||||
ou.[OrganizationUserId],
|
||||
GETUTCDATE()
|
||||
FROM
|
||||
@OrganizationUserIds ou;
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
-- Insert collections for users who obtained semaphore entries
|
||||
INSERT INTO [dbo].[Collection]
|
||||
(
|
||||
[Id],
|
||||
[OrganizationId],
|
||||
[Name],
|
||||
[CreationDate],
|
||||
[RevisionDate],
|
||||
[Type],
|
||||
[ExternalId],
|
||||
[DefaultUserCollectionEmail]
|
||||
)
|
||||
SELECT
|
||||
ou.[CollectionId],
|
||||
@OrganizationId,
|
||||
@DefaultCollectionName,
|
||||
GETUTCDATE(),
|
||||
GETUTCDATE(),
|
||||
1, -- CollectionType.DefaultUserCollection
|
||||
NULL,
|
||||
NULL
|
||||
FROM
|
||||
@OrganizationUserIds ou;
|
||||
BEGIN TRY
|
||||
-- Insert semaphore entries first to obtain the "lock"
|
||||
-- If this fails due to duplicate key, the entire transaction will be rolled back
|
||||
INSERT INTO [dbo].[DefaultCollectionSemaphore]
|
||||
(
|
||||
[OrganizationId],
|
||||
[OrganizationUserId],
|
||||
[CreationDate]
|
||||
)
|
||||
SELECT
|
||||
@OrganizationId,
|
||||
ou.[OrganizationUserId],
|
||||
GETUTCDATE()
|
||||
FROM
|
||||
@OrganizationUserIds ou;
|
||||
|
||||
-- Insert collection user mappings
|
||||
INSERT INTO [dbo].[CollectionUser]
|
||||
(
|
||||
[CollectionId],
|
||||
[OrganizationUserId],
|
||||
[ReadOnly],
|
||||
[HidePasswords],
|
||||
[Manage]
|
||||
)
|
||||
SELECT
|
||||
ou.[CollectionId],
|
||||
ou.[OrganizationUserId],
|
||||
0, -- ReadOnly = false
|
||||
0, -- HidePasswords = false
|
||||
1 -- Manage = true
|
||||
FROM
|
||||
@OrganizationUserIds ou;
|
||||
-- Insert collections for users who obtained semaphore entries
|
||||
INSERT INTO [dbo].[Collection]
|
||||
(
|
||||
[Id],
|
||||
[OrganizationId],
|
||||
[Name],
|
||||
[CreationDate],
|
||||
[RevisionDate],
|
||||
[Type],
|
||||
[ExternalId],
|
||||
[DefaultUserCollectionEmail]
|
||||
)
|
||||
SELECT
|
||||
ou.[CollectionId],
|
||||
@OrganizationId,
|
||||
@DefaultCollectionName,
|
||||
GETUTCDATE(),
|
||||
GETUTCDATE(),
|
||||
1, -- CollectionType.DefaultUserCollection
|
||||
NULL,
|
||||
NULL
|
||||
FROM
|
||||
@OrganizationUserIds ou;
|
||||
|
||||
-- Insert collection user mappings
|
||||
INSERT INTO [dbo].[CollectionUser]
|
||||
(
|
||||
[CollectionId],
|
||||
[OrganizationUserId],
|
||||
[ReadOnly],
|
||||
[HidePasswords],
|
||||
[Manage]
|
||||
)
|
||||
SELECT
|
||||
ou.[CollectionId],
|
||||
ou.[OrganizationUserId],
|
||||
0, -- ReadOnly = false
|
||||
0, -- HidePasswords = false
|
||||
1 -- Manage = true
|
||||
FROM
|
||||
@OrganizationUserIds ou;
|
||||
|
||||
COMMIT TRANSACTION;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
IF @@TRANCOUNT > 0
|
||||
ROLLBACK TRANSACTION;
|
||||
|
||||
THROW;
|
||||
END CATCH
|
||||
END
|
||||
GO
|
||||
|
||||
Reference in New Issue
Block a user