【问题标题】:Can a sql server decide if the client can write a record if there are already too many records that are with the same date?如果已经有太多相同日期的记录,sql server 是否可以决定客户端是否可以写入记录?
【发布时间】:2013-10-21 21:08:23
【问题描述】:

甚至不知道如何搜索这样的东西,但例如:

First Table:
Id, Date, Maximum records
Second Table:
Id, Date, more properties

是否可以在服务器端定义一些规则,如果第二个表有太多相同日期的记录并且超过了第一个表的当前日期的最大记录值,那么服务器会抛出一个错误还是某种异常会阻止对该日期的 sql 插入查询?

可能:

First Table:
1,Date1,2
Second Table:(Maximum 2 on Date 1)
1,Date3,...
2,Date1,...
3,Date1,...

不可能:

First Table:
1,Date1,2
Second Table:(Maximum 2 on Date 1)
1,Date3,...
2,Date1,...
3,Date1,...
4,Date1,...

如果无法做到这一点,那么在具有实体框架的 Windows 窗体应用程序上实现此类检查的最佳方法是什么?

【问题讨论】:

  • 您也许可以使用Trigger 来拒绝插入。 This question 有一个可能的 MySQL 解决方案。类似的东西可能适用于 SQL-Server
  • 这对于数据库设计来说似乎是一个奇怪的要求。你在做什么导致你有这个要求?
  • @ScottChamberlain 我一次会有很多正在运行的应用程序,它们会检查当前的数据库表。如果其中许多应用程序中的某个人想要在最后一个剩余位置(特定日期)插入一条记录,我希望服务器验证不是客户端应用程序验证,因为可能存在超时等等。跨度>
  • @M.J.这是一个很容易解决的常见问题,根本不需要使用单独的表。所有这些都可以通过服务器上的事务和存储过程来完成。不要陷入XY Problem 我建议提出一个新问题并解释您正在尝试做什么以及您面临的挑战(例如让服务器验证而不是客户端)并提出问题“How do我解决了这个问题?”而不是“我如何实施这个解决方案(针对一个我没有告诉你的问题)?
  • @ScottChamberlain 好的,感谢您的解释,我本可以创建这个问题而不是这个问题。 :)

标签: sql sql-server entity-framework


【解决方案1】:

简短的回答是肯定的。

您需要编写一个trigger(一种特殊类型的存储过程,作为插入、删除和更新语句执行的一部分执行)来强制执行您的约束,因为它们不能在关系模式中表达。缺点是,与某些 SQL 实现不同,SQL Server 触发器在插入、删除或更新语句的所有工作完成后触发:如果触发器验证失败,则事务回滚,这意味着可能有很多工作必须撤消。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    相关资源
    最近更新 更多