【问题标题】:Re-Inserting deleted rows into the same table SQL Server 2005将已删除的行重新插入同一个表 SQL Server 2005
【发布时间】:2021-03-25 19:43:09
【问题描述】:

在搜索了很多页面后,我仍然找不到关于在同一个表中重新插入已删除行的答案 - 而不是另一个表。

我有一个名为 timetable 的表,其主键由 3 列 Schoolcode, Year, Term 组成。

由于某种原因,我需要将已删除的行插入到同一个表中。

我得到了错误

违反主键约束

使用以下触发器

ALTER TRIGGER [dbo].[AFTER_delete_]
ON [dbo].timetable 
AFTER delete
AS
BEGIN
    IF EXISTS (SELECT * FROM deleted)
    BEGIN
        INSERT INTO timetable
            SELECT * 
            FROM deleted A 
            WHERE NOT EXISTS (SELECT 1  FROM timetable B      
                              WHERE B.Schoolcode = A.Schoolcode  
                                AND B.Year = A.Year   
                                AND B.Term = A.Term);
    END
END 

【问题讨论】:

  • SQL Server 20082008 R2 一年多前就已结束生命周期,现在完全不受支持 -和 SQL Server 2005 甚至还有几年......您应该真正考虑升级到受支持的版本。
  • 需要提供表结构
  • 这听起来是个糟糕的主意,但我知道要改变你的道路绝非易事。首先,我建议您在删除必须存在且永远不应该删除的行时简单地抛出一个错误。或者,使用而不是触发器来“过滤”删除,这样那些“必需”的行就不会被实际删除。
  • @SM或者你能用而不是触发器重写我的代码
  • 也许-但这不是免费的代码编写服务,您也没有完全解释什么可以删除,什么不能删除的规则。在我看来,您的目标只是不允许任何删除。如果是这样,我们通过设置适当的权限来做到这一点。或者,如果有任何行受到删除的影响,您只需在删除触发器中抛出一个错误。除了验证已删除表中是否存在行之外,我不明白为什么您需要任何条件逻辑。

标签: sql-server triggers insert


【解决方案1】:

谢谢。我测试了下面的代码并且确实有效。

    ALTER TRIGGER [dbo].[Instead_OfDelSert_Status]
    ON  [dbo].[Status]
    INSTEAD OF delete,insert
    AS
    BEGIN
    PRINT 'You must disable or delete Trigger  Instead_OfDelSert_Status  to insert or 
    delete rows!'
    END 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多