|
1
48
触发器无法修改更改的数据(
编辑: 原因是SQL的标准是插入和删除的行不能被触发器修改。根本原因是这些修改可能会导致无限递归。在一般情况下,这种评估可能涉及相互递归级联中的多个触发器。让系统智能地决定是否允许此类更新在计算上是棘手的,本质上是对 halting problem. 公认的解决方案是不允许触发器更改更改更改的数据,尽管它可以回滚事务。
这样的操作将回滚交易。
|
|
2
39
你可以颠倒逻辑。不要在插入无效行后将其删除,而是写入
如果你的应用程序不想处理错误(正如Joel在他的应用程序中所说),那么就不要
我在SQL Server Express 2005上运行了这个程序,它工作正常。注意
|
|
|
3
28
这是我对比尔代码的修改版本:
这使得插入始终成功,任何虚假记录都会被扔进sometableRejects中,以便以后处理。重要的是让你的拒绝表对所有内容都使用nvarchar字段,而不是int、tinyints等,因为如果它们被拒绝,那是因为数据不是你期望的那样。 这也解决了多记录插入问题,这将导致Bill的触发器失败。如果你同时插入十条记录(就像你选择插入一样),其中只有一条是伪造的,比尔的触发器会将所有记录标记为错误。这可以处理任何数量的好记录和坏记录。 我在一个数据仓库项目中使用了这个技巧,在这个项目中,插入应用程序不知道业务逻辑是否良好,我们在触发器中执行了业务逻辑。对性能来说真的很糟糕,但如果你不能让插件失败,它确实有效。 |
|
|
4
12
我认为你可以使用CHECK约束——这正是它被发明的目的。
我之前的回答(也可能有点过头了): 我认为正确的方法是使用INSTEAD OF触发器来防止插入错误的数据(而不是事后删除) |
|
5
7
更新:触发器中的DELETE在MSSql 7和MSSql 2008上都有效。 我不是关系专家,也不是SQL标准专家。然而,与公认的答案相反,MSSQL在这两个方面都做得很好 ecursive and nested trigger evaluation 。我不知道其他RDBMS。 相关选项包括 'recursive triggers' and 'nested triggers' 嵌套触发器限制为32级,默认为1级。递归触发器默认情况下是关闭的,也没有限制的说法——但坦率地说,我从未打开过它们,所以我不知道不可避免的堆栈溢出会发生什么。我怀疑MSSQL只会杀死你的蜘蛛(或者有一个递归限制)。 当然,这只是表明公认的答案是错误的 原因 ,并不是说这是不正确的。然而,在INSTEAD OF触发器之前,我记得在INSERT触发器上写过,它会愉快地更新刚刚插入的行。这一切都很好,正如预期的那样。 快速测试删除刚刚插入的行也有效:
你这里还有别的事。 |
|
|
6
4
从 CREATE TRIGGER 文档:
因此,这至少为您提供了一种查看新数据的方式。 我在文档中看不到任何指定在查询普通表时看不到插入的数据的内容。.. |
|
7
3
我找到了这个参考:
我还没有测试它,但从逻辑上讲,它看起来应该符合你的要求。..与其删除插入的数据,不如完全阻止插入,从而不需要您撤消插入。它应该表现得更好,因此最终应该更容易处理更高的负载。 编辑:当然有 是 如果插入发生在原本有效的事务中,wole事务可能会被回滚,因此您需要考虑这种情况,并确定插入无效数据行是否构成完全无效的事务。.. |
|
|
8
0
有没有可能INSERT是有效的,但之后进行的单独UPDATE是无效的,但不会触发触发器? |
|
|
9
0
上面概述的技术很好地描述了你的选择。但是用户看到了什么?我无法想象,你和负责软件的人之间的这种基本冲突怎么会不会最终导致与用户的混淆和对抗。 我会尽我所能找到摆脱僵局的其他方法,因为其他人很容易看到你所做的任何改变都会使问题升级。 编辑: 我会给我的第一个“取消删除”打分,并承认在这个问题第一次出现时发布了上述内容。当我看到它来自乔尔·斯波尔斯基时,我当然吓了一跳。但看起来它降落在附近的某个地方。不需要投票,但我会把它记录在案。 IME触发器很少是业务规则领域之外细粒度完整性约束之外的正确答案。 |
|
|
10
0
MS-SQL有一个防止递归触发器触发的设置。这是通过sp_configure存储过程配置的,您可以在其中打开或关闭递归或嵌套触发器。 在这种情况下,如果您关闭递归触发器,通过主键从插入的表链接记录,并对记录进行更改,这是可能的。 在问题的具体情况下,这并不是一个问题,因为结果是删除记录,这不会重新触发这个特定的触发器,但一般来说,这可能是一种有效的方法。我们以这种方式实现了乐观并发。 可以以这种方式使用的触发器代码是:
|
|
|
11
0
你的“触发器”正在做一些“触发器”不应该做的事情。您可以简单地运行Sql Server代理
每1秒左右。当你这样做的时候,写一个漂亮的小SP来阻止编程人员在你的表中插入错误怎么样。SP的一个优点是参数是类型安全的。 |
|
|
12
0
我在插入语句时偶然发现了这个问题,想了解事件顺序的细节;触发。我最终编写了一些简短的测试来确认SQL 2016(EXPRESS)的行为,并认为分享它是合适的,因为它可能会帮助其他人搜索类似的信息。 根据我的测试,可以从“插入”表中选择数据,并使用它来更新插入的数据本身。而且,我感兴趣的是,在触发器完成之前,插入的数据对其他查询是不可见的,此时最终结果是可见的(至少我可以测试到最好的结果)。我没有测试递归触发器等。(我希望嵌套触发器能够完全看到表中插入的数据,但这只是猜测)。 例如,假设我们的表“table”有一个整数字段“field”和主键字段“pk”,并且插入触发器中有以下代码:
我们为“field”插入一个值为1的行,然后该行将以值2结束。此外,如果我在Contoso中打开另一个窗口并尝试: 从pk=@pk的表中选择* 其中@pk是我最初插入的主键,查询将为空,直到15秒到期,然后将显示更新的值(字段=2)。 我对触发器执行时其他查询可见的数据感兴趣(显然没有新数据)。我也测试了添加删除:
同样,插入需要15秒才能执行。在不同会话中执行的查询在执行插入+触发器期间或之后没有显示新数据(尽管我预计即使没有插入数据,任何标识也会增加)。 |
|
|
Saijo-Shi · PLpgsql中的更新触发器 1 年前 |
|
|
user26814368 · Oracle在触发器中过滤错误数据 1 年前 |
|
|
robertspierre · 在多对多关系中自动删除未引用的行 2 年前 |
|
|
Martin · 由于活动触发器,无法登录到SQL Server 2 年前 |
|
|
gonzalo2000 · 脚本在手动运行时有效,但触发器不起作用 2 年前 |
|
|
yessoos · 在触发的处理程序中使用类属性 3 年前 |