防止 MS-SQL 表中的循环引用

2023-12-14

我有一个包含 ID 和 ParentAccountID 的帐户表。以下是重现这些步骤的脚本。

如果 ParentAccountID 为 NULL,则该帐户被视为顶级帐户。 每个帐户最终应以顶级帐户结束,即 ParentAccountID 为 NULL

    Declare @Accounts table (ID INT, ParentAccountID INT )    


    INSERT INTO @Accounts values (1,NULL), (2,1), (3,2) ,(4,3), (5,4), (6,5)

    select * from @Accounts

     -- Request to update ParentAccountID to 6 for the ID 3
    update @Accounts  
    set ParentAccountID = 6
    where ID = 3

    -- Now the above update will cause circular reference 
    select * from @Accounts

当请求到来时,例如更新帐户的 ParentAccountID,如果这会导致循环引用,则在更新之前需要对其进行识别。

大家有什么想法吗?


看来您已经为您的表定义了一些业务规则:

  • 所有链必须以顶级账户结束
  • 链不能有循环引用

您有两种方法可以强制执行此操作。

您可以创建一个trigger在您的数据库中,并检查触发器中的逻辑。这样做的好处是在数据库内部运行,因此它适用于每个事务,无论客户端如何。然而,数据库触发器并不总是流行。我将他们视为副作用,而且它们可能很难调试。触发器作为 SQL 的一部分运行,因此如果它们很慢,您的 SQL 也会很慢。

另一种方法是在应用程序层中强制执行此逻辑 - 无论与数据库通信的是什么。这更容易调试,并使您的业务逻辑对新开发人员来说是明确的 - 但它不在数据库内运行,因此如果您有多个客户端应用程序,您最终可能会复制逻辑。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

防止 MS-SQL 表中的循环引用 的相关文章

  • REPLACE MYSql 中的新行字符不起作用

    我执行了以下查询 由于某种原因它没有替换数据库中的换行符 它说 Rows matches 1 但没有变化 有什么问题吗 mysql gt UPDATE aboutme SET abouttext REPLACE abouttext n WH
  • T-SQL 相当于 =rand()

    我有几个内容表 我想用随机的文本段落填充它们 在 MS Word 中 我只需输入 rand 即可 我收到三段新鲜的文字 是否有 SQL 脚本 命令可用于使用 t sql 生成随机字典单词 declare Lorem nvarchar max
  • 没有特定表的MSSQL数据库备份

    我需要在 sql 中没有特定表的情况下进行计划备份 因为如果我对该表进行备份 将需要很长时间 我需要从备份中排除一张表 是否可以 如果没有该表 所有表和数据都应该位于数据库中 除了 PRIMARY 文件组之外 您还可以为该表设置一个单独的文
  • 在旧版本的 MySQL (<5.5.0) 中模拟 TO_SECONDS()

    出于性能和简单性的原因 我想以秒的形式获取 MySQL 3 x 服务器中 DATETIME 列的内容 或者实际上任何数字类型 我只是想在使用 UNIX TIMESTAMP 时避免所有明显的时区问题 the我表中的日期确实来自不同的区域设置
  • DBCC命令是存储过程还是函数?

    应该是什么DBCC命令被调用 DBCC 过程还是 DBCC 函数 这很令人困惑 因为DBCC PAGE可以在不加前缀的情况下执行EXEC语句很像存储过程 但EXEC DBCC PAGE 1 1 1 3 抛出错误 语法错误 消息 156 关键
  • 智能感知不工作 SSMS 2014

    我知道有很多关于这个问题的帖子 但是我无法找到解决我的问题的方法 跑步 SMS 2014 with CU1 SSMS 和客户端工具上的版本 10 0 2342 0 Visual Studio 2010 SP1 10 0 40219 1 SP
  • SQL 性能,使用 OPTION (FAST n)

    谁能告诉我在 SQL 查询中使用 OPTION FAST n 有什么缺点 比如我这么快就抓取了10万条记录 但这对SQL Server的其他进程有影响吗 我正在接近我的问题 我必须每周运行一次数据处理 因此 第一个结果会在 5 7 秒后出现
  • Linq lambda表达式多对多表选择

    我有三个表 其中两个是多对多关系 Picture 这是中间mm表中的数据 Edit 到这里 我得到正确的 4 行返回 但它们都是相同的结果 我知道我需要返回 4 行 但有不同的结果 return this mediaBugEntityDB
  • SQL FORMAT 函数错误

    这个SQL select FORMAT lNum from rpt myView 产生以下错误 参数数据类型 varchar 对于格式的参数 1 无效 功能 lNum is a varchar 10 运行 SQL Server 2012 v
  • 查找 SQL Server 中表的 B 树高度

    由于数据库数据以B Tree的形式组织在8k页中 对于PK信息也是如此 数据库中的每个表都应该可以计算B Tree的高度 从而揭示达到某些数据需要多少次跳跃 由于行大小和 PK 大小都非常重要 因此很难计算 因为例如varchar 250
  • SQL如何显示某个日期之前的数据

    我有几张桌子 一个是一个工人表显示工人代码 名字和姓氏 工作日期其中显示工人代码 工作开始日期 结束日期和工作区域代码 导师有工人编号 名字 姓氏和工作区号 Job area有工作区域代码名称和主管 我想要做的是在日期 10 09 10 之
  • Linq 选择与另一个表中的 ID 相等的项目

    我不确定这怎么可能 但我有两个表 我想通过表 1 的值从表 2 中获取值 表 1 有一个名为 rank 的外键 它是int 表 2 有一个名为 name 的值 它是string 现在表 1 的 排名 与表 2 的 ID 相关 所以当我说 v
  • 如何在 SQL 中选择“上一条”和“下一条”记录?

    I am building a blog post detail page on my site that will display display a previous and next link similar to how a typ
  • SQL 中的代码重用和模块化

    代码重用和模块化对于 SQL 存储过程编程来说是一个好主意吗 如果是这样 将这些功能添加到 SQL 存储过程代码库的最佳方法是什么 我通常为常见且重复的任务创建标量值函数 我发现它不仅可以简化与现有程序类似的新程序的开发 而且还有助于错误跟
  • MSSQL:如何使用代码编写存储过程创建脚本?

    我正在尝试使用一个数据库中存在但另一个数据库中不存在的 information schema routines 查询存储过程定义列表 SELECT t1 Routine Definition FROM server1 MyDatabase
  • 我想从 Crystal Report .rpt 文件中提取 SQL 查询,有办法做到这一点吗?

    我想从 Crystal Report rpt 文件中提取 SQL 查询 有办法做到这一点吗 我没有任何 Crystal Reports 产品 只有 rpt 文件 下面是一个 Net 代码示例 它从给定目录中的所有 Crystal Repor
  • 查询从同一表中的另一条记录获取值并按大于间隙阈值的差异进行过滤

    我将数据导入到 MS Access 中的临时表中 如下所示 我添加了需要使用 SQL 查询计算的 Gap 和 Previous Current 列 间隙阈值 是用户输入或范围提供给查询和例如是 300 GlobalID 对 ItemID 进
  • 从 SQL Server 中的子查询值或其他聚合函数获取平均值

    我有 SQL 语句 SQL Server SELECT COUNT ActionName AS pageCount FROM tbl 22 Benchmark WHERE DATEPART dw CreationDate gt 1 AND
  • max()、分组依据和排序依据

    我有以下 SQL 语句 SELECT t client id max t points AS max FROM sessions GROUP BY t client id 它只是列出了客户 ID 以及他们所获得的最大积分 现在我想按 max
  • 随机排列每行的列值

    我正在使用 C NET 开发多项选择题考试生成器 每次做出报告时 都会在数据库中随机挑选问题 并随机调整选项 我可以做随机问题部分 但我不能做选择的洗牌 我有一张表 其中一行如下 question answer distractor1 di

随机推荐

  • Excel 和 C# 应用程序之间的进程间通信?

    我想知道是否有一种方法可以在 excel 实例和 C 应用程序之间建立通信 例如 当单元格值发生变化时 我想将更新后的值实时发送到 C 应用程序 提前致谢 你需要办公室主要互操作程序集 它们是 MS Office 公开的 COM API 的
  • Swift 中的泛型和函数式编程

    下面 sum 函数的两个变体是我尝试用 Swift 重复 Abelson 和 Sussman 在经典的 计算机程序的结构和解释 一书中介绍的 lisp 版本 第一个版本用于计算某个范围内的整数之和 或某个范围内的整数的平方和 第二个版本用于
  • tvOS UITextField 编辑后为空

    Editing UITextFieldtvOS 中显示了一个新视图 用户可以在其中输入文本 完成文本输入后 用户将返回到之前的视图 但是 我发现当我从文本编辑器返回时 我编辑的文本不会显示在我的文本字段中 这是怎么回事 电视操作系统版本9
  • MySQL,多行分隔字段

    我有一个 MySQL 表 其中包含如下字段和数据 PartNumber Priority SupName a1 0 One a2 0 One a2 1 Two a3 0 One a4 1 Two a5 2 Three 我正在尝试创建一个视图
  • C# 无协议 SuperSocket

    问题很简单 我已阅读全文超级插座文档 但我不明白是否有一种方法可以在不实现协议的情况下使用它 我不需要发送特定的命令 而只需发送可能是一个或数百个字节 具体取决于许多因素 我需要更新一个使用简单套接字的旧 TCP 服务器 它是我在 4 年前
  • 如何使用 webpack 混淆 js 文件

    我想在 public js 中混淆我的 js 文件 但在混淆之前 是否可以先在我的 public 文件夹外部的其他目录中传输 然后混淆的结果将在 public js 中 先感谢您 我的回答来得很晚 但我建议https obfuscator
  • 值类型何时存储在堆栈中(C#)?

    当我阅读下一本书的 值和引用类型 一章时 我想到了一个问题 值类型何时存储在堆栈中 因为程序员无法在类外初始化任何值类型 因为当我们在类中初始化一些值类型的变量时 变量就会存储在堆中 我的问题是 值类型什么时候存储在堆栈中 好吧 首先 您很
  • CMake 无法与 Google Protobuf 配合使用

    无法使用 CMake 链接 protobuf 库 我的 CMakeLists 是 cmake minimum required VERSION 3 6 project addressbook set CMAKE CXX STANDARD 1
  • 不带计数器的自定义周期函数

    我在用ode45求解一个简单的 ODE function dCdt u vent t C if t gt 600 t lt 720 Q Q2 elseif t gt 1320 t lt 1440 Q Q2 elseif t gt 2040
  • 获取日期时间之间的时间差

    如何求2次之间的差值 例子 var now 04 09 2013 15 00 00 var then 04 09 2013 14 20 30 expected result 00 39 30 I tried var now moment 0
  • JavaScript 监听器不断增加

    我实现了一个网络应用程序并使用谷歌开发人员工具监控了性能 我注意到听众不断增加 听众数量也在不断增加 听众增加的部分看起来像这样 let ival interval function http get someurl this call i
  • 使用 ffmpeg 进行转换,无需执行

    我的 Windows XP Apache PHP 5 3 和 ffmpeg 工作正常 我需要将 flv 转换为 avi 或反之亦然 而不使用exec 命令 这可能吗 谢谢 编辑 我希望有人可以编辑 ffmpeg 源代码并在 php 扩展中实
  • csh 上的自连接字符串

    我需要将 argv 中的部分内容连接到我的变量之一 我将向您展示我的代码 bin csh set stringList foreach param argv if param TEST then set stringList stringL
  • 为什么不使用 IoC 容器来解决实体/业务对象的依赖关系?

    我了解 DI 背后的概念 但我只是在学习不同的 IoC 容器可以做什么 似乎大多数人都主张使用 IoC 容器来连接无状态服务 但是将它们用于实体等有状态对象呢 无论是对还是错 我通常都会用行为填充我的实体 即使该行为需要外部类 例子 pub
  • CSS3:检测 iPhone 的设备方向

    所以这个声明适用于 iOS 4 和 4 1 但不适用于旧版本 有什么建议吗 media screen and device width 320px and orientation portrait iPhone Portrait Style
  • 当值改变时MySQL增加用户变量

    我有一个由组组成的表 例如 每组五行 每组中的每一行都拥有一个date该群体独有的价值 我想要在查询中执行的操作是遍历表 并在执行此操作时增加用户变量 count date值变化 也就是说 count 应该等于组数 而不是行数 我当前的查询
  • 将集合 S 公平划分为 k 个分区

    存在一个集合 S 其中包含 N 个整数 每个整数的值为 1fair还需要定义 例如 目标可能是最小化分区值与集合 S 平均值的标准偏差 即 sum S k 例如S 10 15 12 13 30 5 k 3 一个好的分区是 30 10 15
  • 如何通过Selenium和Webdriver提高执行速度

    测试脚本执行过程中速度非常慢 不知道原因 这是我的脚本 driver Navigate GoToUrl url driver Manage Timeouts ImplicitWait TimeSpan FromSeconds 20 driv
  • QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka 转换器

    我需要处理YUVAndroid 上 H W 解码输出的数据 实际上 我使用的是Nexus4 解码输出格式是QOMX COLOR FormatYUV420PackedSemiPlanar64x32Tile2m8ka type 但是我需要YUV
  • 防止 MS-SQL 表中的循环引用

    我有一个包含 ID 和 ParentAccountID 的帐户表 以下是重现这些步骤的脚本 如果 ParentAccountID 为 NULL 则该帐户被视为顶级帐户 每个帐户最终应以顶级帐户结束 即 ParentAccountID 为 N