使用存储过程加载用户提取
Load user extract with stored procedure
我有一个 ASP MVC 网络应用程序,需要每天从文件中加载用户提取内容。数据库中的用户应该相应地更新:如果不在源中则删除,如果在源和目标中则更新,如果仅在源中则创建。在这样做的同时,某些权利也应该自动赋予用户。如果有任何错误,根本不会发生任何事情。
首先,我尝试使用 Entity Framework 执行此操作,但 SaveChanges 调用大约需要两分钟才能到达 return,这对于相对较少的用户 (~140 000) 来说是很多的。
我现在的想法是编写一个存储过程来进行更新。我会将新用户列表作为参数传递。我临时的类型 table:
CREATE TYPE [dbo].[TempUserType] AS TABLE
(
[Uid] NVARCHAR(80) NOT NULL PRIMARY KEY,
[GivenName] NVARCHAR(80) NOT NULL,
[FamilyName] NVARCHAR(80) NOT NULL,
[Email] NVARCHAR(256) NOT NULL,
[GiveRight1] BIT NOT NULL,
[GiveRight2] BIT NOT NULL,
[GiveRight3] BIT NOT NULL
)
用户:
CREATE TABLE [dbo].[User] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Uid] NVARCHAR (80) NOT NULL,
[GivenName] NVARCHAR (80) NOT NULL,
[FamilyName] NVARCHAR (80) NOT NULL,
[Email] NVARCHAR (256) NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC),
UNIQUE NONCLUSTERED ([Uid] ASC)
);
用户角色:
CREATE TABLE [dbo].[UserRole] (
[UserId] INT NOT NULL,
[RoleId] INT NOT NULL,
CONSTRAINT [PK_UserRole] PRIMARY KEY CLUSTERED ([UserId] ASC, [RoleId] ASC),
CONSTRAINT [FK_UserRole_User] FOREIGN KEY ([UserId]) REFERENCES [dbo].[User] ([Id]),
CONSTRAINT [FK_UserRole_Role] FOREIGN KEY ([RoleId]) REFERENCES [dbo].[Role] ([Id])
);
我卡在写的程序:
CREATE PROCEDURE [dbo].[UpdateUsers]
@extractedUsers TempUserType READONLY
AS
BEGIN TRANSACTION
MERGE
[dbo].[User] AS trg
USING
@extractedUsers AS src
ON
(trg.[Uid] = src.[Uid])
WHEN MATCHED THEN
UPDATE SET
trg.GivenName = src.GivenName,
trg.FamilyName = src.FamilyName,
trg.Email = src.Email
WHEN NOT MATCHED BY TARGET THEN
INSERT
([Uid], GivenName, FamilyName, Email)
VALUES
(src.[Uid], src.GivenName, src.FamilyName, src.Email)
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
COMMIT TRANSACTION
我的问题:在这种情况下使用带有合并的过程是否适合实现对 EF 的性能改进?我如何根据源 table?
中的 3 个布尔值来分配角色
角色可以hadcoded,也就是说我知道Right1对应RoleId 1,Right 2对应RoleId 2,Right 3对应RoleId3。
看完问题想留下解决思路。
对我来说,使用 IF / ELSE 调用更新或插入更有意义,而不是使用合并,因为你需要你是 updating/inserting 的 UserId 来添加它的角色权限。
您可以检查 UId 是否存在,如果存在则更新用户详细信息,如果不存在则创建并保留新的身份值。
两种情况下,当有用户ID时,根据布尔值用IF语句添加相应的权限。
伪代码:
If UserId exists in UsersTable
Update
Store UserId
Else
Insert
Store created UserId (using the @@IDENTITY)
If bool1 add permission 1
If bool3 add permission 2
If bool3 add permission 3
我有一个 ASP MVC 网络应用程序,需要每天从文件中加载用户提取内容。数据库中的用户应该相应地更新:如果不在源中则删除,如果在源和目标中则更新,如果仅在源中则创建。在这样做的同时,某些权利也应该自动赋予用户。如果有任何错误,根本不会发生任何事情。
首先,我尝试使用 Entity Framework 执行此操作,但 SaveChanges 调用大约需要两分钟才能到达 return,这对于相对较少的用户 (~140 000) 来说是很多的。
我现在的想法是编写一个存储过程来进行更新。我会将新用户列表作为参数传递。我临时的类型 table:
CREATE TYPE [dbo].[TempUserType] AS TABLE
(
[Uid] NVARCHAR(80) NOT NULL PRIMARY KEY,
[GivenName] NVARCHAR(80) NOT NULL,
[FamilyName] NVARCHAR(80) NOT NULL,
[Email] NVARCHAR(256) NOT NULL,
[GiveRight1] BIT NOT NULL,
[GiveRight2] BIT NOT NULL,
[GiveRight3] BIT NOT NULL
)
用户:
CREATE TABLE [dbo].[User] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Uid] NVARCHAR (80) NOT NULL,
[GivenName] NVARCHAR (80) NOT NULL,
[FamilyName] NVARCHAR (80) NOT NULL,
[Email] NVARCHAR (256) NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC),
UNIQUE NONCLUSTERED ([Uid] ASC)
);
用户角色:
CREATE TABLE [dbo].[UserRole] (
[UserId] INT NOT NULL,
[RoleId] INT NOT NULL,
CONSTRAINT [PK_UserRole] PRIMARY KEY CLUSTERED ([UserId] ASC, [RoleId] ASC),
CONSTRAINT [FK_UserRole_User] FOREIGN KEY ([UserId]) REFERENCES [dbo].[User] ([Id]),
CONSTRAINT [FK_UserRole_Role] FOREIGN KEY ([RoleId]) REFERENCES [dbo].[Role] ([Id])
);
我卡在写的程序:
CREATE PROCEDURE [dbo].[UpdateUsers]
@extractedUsers TempUserType READONLY
AS
BEGIN TRANSACTION
MERGE
[dbo].[User] AS trg
USING
@extractedUsers AS src
ON
(trg.[Uid] = src.[Uid])
WHEN MATCHED THEN
UPDATE SET
trg.GivenName = src.GivenName,
trg.FamilyName = src.FamilyName,
trg.Email = src.Email
WHEN NOT MATCHED BY TARGET THEN
INSERT
([Uid], GivenName, FamilyName, Email)
VALUES
(src.[Uid], src.GivenName, src.FamilyName, src.Email)
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
COMMIT TRANSACTION
我的问题:在这种情况下使用带有合并的过程是否适合实现对 EF 的性能改进?我如何根据源 table?
中的 3 个布尔值来分配角色角色可以hadcoded,也就是说我知道Right1对应RoleId 1,Right 2对应RoleId 2,Right 3对应RoleId3。
看完问题想留下解决思路。 对我来说,使用 IF / ELSE 调用更新或插入更有意义,而不是使用合并,因为你需要你是 updating/inserting 的 UserId 来添加它的角色权限。
您可以检查 UId 是否存在,如果存在则更新用户详细信息,如果不存在则创建并保留新的身份值。
两种情况下,当有用户ID时,根据布尔值用IF语句添加相应的权限。
伪代码:
If UserId exists in UsersTable
Update
Store UserId
Else
Insert
Store created UserId (using the @@IDENTITY)
If bool1 add permission 1
If bool3 add permission 2
If bool3 add permission 3