SQL Server约束。按字段筛选的最大行数

时间:2017-03-30 17:06:47

标签: sql sql-server entity-framework

首先抱歉我的英语。

我的问题:我有一个使用Asp.Net + EF代码优先的应用程序。我在SQL Server中有一个表:

Id   TypeId   Name
--------------------
1    1        Suite
2    1        Desk

在我的应用程序中,有两个插件在2个线程中运行。

我需要在我的表上创建一个约束 - TypeId = 1每个表只能有3行。

因此,如果两个线程进行查询,则只有一个可以成功,因为TypeId = 1还剩1行。

我如何检查?如何不同时运行插入或者你有其他很好的解决方案?

每个TypeId的行数约束可以不同。还有另一个名为TypeConstraints的表,其中存储了两列。

TypeId  RowsCount
1       3
2       5
3       4
4       11
5       8

依旧......

已找到解决方案:

ALTER function dbo.UdfCheckCount (
        @TypeId int
    ) returns int as
    begin;
    declare @max int;
    select @max = MaxCount from TypeConstraints where TypeId = @TypeId;
      declare @count int = 
      (
        select count(*) from Data where TypeId = @TypeId
      )

      return @max - @count;
    end;
    go

    alter table Data  WITH NOCHECK add constraint test check (dbo.UdfCheckCount(TypeId) >= 0)

1 个答案:

答案 0 :(得分:0)

您可以在数据库上编写一个触发器来检查并触发错误。

CREATE TRIGGER dbo.Table 
AFTER INSERT 
AS
BEGIN
    -- Do your check here to see if the type count has been exceeded
    IF (SELECT COUNT(*) FROM dbo.Table WHERE TypeID = <etc ...> )
    BEGIN 
        RAISERROR ('Maximum number of rows for this type has been exceeded', 16, 1);
        ROLLBACK TRANSACTION;
    END
END

然后,只需处理应用程序中的错误并从那里继续。

但是,我不确定触发器是如何从EF Code-First角度出发的。我无法想象它会导致任何问题。