【问题标题】:Insert into two tables at same userID at same time同时插入到相同用户ID的两个表中
【发布时间】:2015-04-06 17:34:17
【问题描述】:

我想一次性在两个表中添加数据。

我有两个表,UserCredentials(userid,username,password,userrole) 和 EmployeeRecord(userid,username,firstname,lastname,desgination,nationality)

UserId 是 DB 中生成的两个表中的身份,我正在寻找一种方法,我可以在 EmployeeRecord 中获取 userID 插入记录,以便我可以在 UserCredentials 表中的相同 userId 处插入登录凭据。两条记录需要同时插入。

这就是我的代码现在的样子:

      create procedure enteremployeerecord ( 

            @firstName varchar(100),
            @lastName varchar(100),
            @desigNation varchar(50),
            @natioNality varchar(50),
            @userName varchar(50),
            @userPassword varchar(50),
            @userRole varchar(50)          
            )
  as
  begin

  insert into EmployeeRecord(username,firstname,lastname,designation,nationality)
  values (@userName,@firstName,@lastName,@desigNation,@natioNality)

  insert into UserCredentials(username,password,userrole)
  values (@userName,@userPassword,@userRole)

这里是 C# 中的 LINQ SQL 代码(不确定两个查询会如何变化)

EmployeeRecordDBClassDataContext con = new EmployeeRecordDBClassDataContext();
con.enteremployeerecord(firstNameTextBox.Text, lastTextBox.Text, desginationTextBox.Text,nationalityTextBox.Text,userNameTextBox.Text, passwordEmployeeTextBox.Text, userRoleTextBox.Text)

我正在使用 VS 2012 和 SQL Server 2012

【问题讨论】:

  • 你为什么不直接创建一个Trigger
  • 不是您问题的答案,但您确实不应该以纯文本形式存储密码。您需要改用盐渍哈希。
  • 您的表也受到非规范化的影响。您在凭证表中有用户角色。这可以防止用户拥有超过 1 个角色。此外,用户名不应超过 1 个表。

标签: c# sql-server linq


【解决方案1】:

UserId 是 DB 中生成的两个表中的标识

坏主意。只有一张表需要负责标识符。否则,您必须添加大量保护措施以确保记录始终同时添加到两个表中。

为了说明,我们假设EmployeeRecord 负责生成UserId。要插入UserCredentials,只需获取生成的 ID 并插入即可:

@DECLARE @userID int  

insert into EmployeeRecord(username,firstname,lastname,designation,nationality)
values (@userName,@firstName,@lastName,@desigNation,@natioNality)

SELECT @userID = @@SCOPE_IDENTITY()

insert into UserCredentials(userid, username,password,userrole)
values (@userid, @userName,@userPassword,@userRole)

此外,表之间存在逻辑 1:1 关系(这在 SQL 中是不可能实现的,因为您不能同时插入两个表)我会质疑是否应该将表合并为一个。如果没有理由将它们分开,那么不要分开它们

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-11
    • 2018-04-19
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 2018-05-03
    相关资源
    最近更新 更多