【问题标题】:"Insert trigger" - update column after insert“插入触发器” - 插入后更新列
【发布时间】:2015-11-06 06:41:40
【问题描述】:
    CREATE TRIGGER [dbo].[TR_dbo_GlLoan_LoanNumber] ON  [dbo].[GlLoan] AFTER     INSERT 
AS 
BEGIN 
 if @@ROWCOUNT = 0
  return
SET NOCOUNT ON;

declare @count int; 
set @count= (select max(loannumber) from glloan where branchid=(select branchid from inserted) and CompanyId=(select CompanyId from inserted)) 
update glloan set loannumber=@count+1 where id=(select id from inserted) 
END

GO

对于给定的分行和公司,是否有可能重复贷款编号?

【问题讨论】:

  • 不完全是您问题的答案,但是:使用身份作为贷款号码不是更简单吗?
  • 你的触发器坏了。 inserted 可以包含 多个 行,此时您会收到类似 branchid=(select branchid from inserted) 说“子查询返回多个值”的错误
  • @Marko 身份未使用,因为多个分支机构或公司将使用相同的贷款编号。
  • @Damien_The_Unbeliever 那么我怎样才能做到这一点。我的表中有贷款编号,对于给定的公司和分支机构来说,它应该是唯一的整数。
  • 如果我们假设没有任何行被删除(你的代码已经这样做了,否则如果最近的插入被删除,下一个插入将生成相同的“唯一”值)然后只需使用IDENTITY 列,然后按ROW_NUMBER() OVER (PARTITION BY branchid,CompanyId ORDER BY Id)计算贷款编号。

标签: sql sql-server-2008 sql-server-2005 sql-server-2008-r2 sql-server-2012


【解决方案1】:

根据我的评论 - 如果我们可以安全地假设没有任何行被删除,我将创建这个结构:

CREATE TABLE _GILoan (
    /* Columns as currently, except no loannumber column */
    _Id int IDENTITY(1,1) not null /* or is Id already defined so? */
)
GO
CREATE VIEW GILoan
AS
    SELECT
        *,
        ROW_NUMBER() OVER (PARTITION BY branchid,companyid
          ORDER BY _Id) /* Or Id */
        as LoanNumber
    FROM _GILoan
GO

然后您以与使用表格相同的方式使用此视图。 LoanNumber 是自动计算的,并且(正如我所说),只要没有删除任何行,分配的数字就不会改变。

【讨论】:

  • 我认为你在这里提到的是正确的。但是我不想创建一个可以使用的视图,因为我首先使用实体​​框架代码,如果我们使用视图移动,更改集将是巨大的。感谢您所付出的努力。有没有其他方法可以通过触发器做到这一点?
【解决方案2】:

我们可以为多列添加唯一约束。

    ALTER TABLE dbo.glloan 
    ADD CONSTRAINT ucLoanNumber UNIQUE (BranchId, CompanyId, LoanNumber)

并使用插入触发器之前计算贷款数量。因此不会插入任何重复项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-13
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多