【问题标题】:Inherited SQL Server Database Problem继承的 SQL Server 数据库问题
【发布时间】:2009-01-12 17:37:59
【问题描述】:

我继承了一个 SQL Server 数据库,出于某种奇怪的原因,开发人员没有使用 Identity 来自动增加主键。 (也许它曾经是 Oracle 的,谁知道呢)。

现在,...由于数据库是从无数客户端访问的,我认为“下一个 ID”必须存储在数据库中的某个地方,这样它们就不会相互冲突。如果我尝试手动添加记录,它会起作用,但是当客户端创建记录时,它会失败,说密钥已在使用中。

我如何确定将其存储在哪个表中,或者您能否建议可以存储 ID 的其他地方?

知道下一个要生成的 ID 可能会有所帮助。因为可能有一种方法可以在任何表的任何记录中查找值。 (如果没有,应该有:)

【问题讨论】:

    标签: sql-server database


    【解决方案1】:

    检查information_schema.constraint_column_usage 以获取所有其他人使用外键引用的表。

    【讨论】:

    • 好主意,什么都没想到。将其更改为 LIKE '%Next%' 仍然没有。
    • 不知道为什么这很重要,因为可能没有对生成该列的表的引用。或者至少我看不到我将如何实现一个。
    【解决方案2】:

    如果它使用存储过程进行插入,那么它可能就在那里。

    【讨论】:

    • 下一个键值是否不需要存储在 sp 之外的其他地方。不过,我会检查代码以获取线索。谢谢。
    • 0 个存储过程。天哪。
    • 不,它不需要存储,当前最大值+1可以在代码中使用。如果它不在存储过程中,那么它听起来像是在代码中:(它没有计算值或分配给它的东西吗?
    【解决方案3】:

    它可能存储在代码中,或者更糟糕的是,每次都在代码中确定。例如在插入之前,它们会获取当前的最高 ID,然后加 1 并插入。

    【讨论】:

    • 对于有很多客户端的系统来说,这将是一个糟糕的问题! IE。你会得到比赛条件。两个客户端可能会尝试使用相同的 MAX+1 值。
    • 但是如果它是在一个带有插入的事务中完成的,它可能不是问题。
    • 是的,我完全同意你们两个。
    【解决方案4】:

    我见过几个这样的系统。

    • 一个人有一个带有自动编号的表,用于在每个表上设置标识。这用于确保每个对象都有不同的 id。

    • 另一个项目是由类似的东西给出的:从表中选择 max(id)+1。不要问我为什么;)

    【讨论】:

      【解决方案5】:

      解决问题并重新开始工作后,切换到唯一标识符 (GUID)。它们不仅可以在独立的时间和空间生成消除竞争条件,而且您可以将它们用作 ROWGUIDCOL 以进行复制。

      【讨论】:

        【解决方案6】:

        最好的办法是查看插入记录的代码(存储过程或从 GUI 动态执行的代码)。以这种方式“设计”的系统经常不能正常工作,并且不能考虑同时请求信息的多个用户。客户端级别的失败可能正是因为它们遇到了竞争条件。

        如果您确实将其更改为使用 Identity(坦率地说,如果这可行,我宁愿这样做而不是使用 GUIDS)并且您需要取回该值以插入子表,然后确保您使用 scope_identity( ) 以返回您刚刚插入的标识值,而不是 @@identity。

        【讨论】:

          【解决方案7】:

          如果您运行 SQL Server Profiler 会话(假设您使用的是 SQL Server 2005+)会怎样?此工具将显示应用程序正在执行的查询。如果下一个 ID 确实存储在数据库中的表中,您应该会在启动时或在插入记录之前看到一个查询访问它。您还应该看到插入后更新的下一个 ID。如果你没有看到任何这些,也许你仍然会得到一些有价值的线索。

          【讨论】:

          • 试过了,不幸的是它没有任何价值。除了 Prepared 语句调用之外,没有找到 SQL 语句。我知道这些应该在第一次编译 SQL 时创建,但是......即使重新启动应用程序也不会重新编译它们。
          • 您需要确保您的探查器跟踪正在侦听正确的事件以查看它们 - 例如Stmt重新编译。
          【解决方案8】:

          运行跟踪并查找插入以查看 ID 是否从客户端显式传入。如果没有,并且没有存储过程,请检查该表上是否存在触发器。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-10-19
            • 1970-01-01
            • 2014-09-26
            • 2011-03-08
            • 2023-03-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多