SqlServer触发器问题

大佬们,表名为DrawingNo_A,字段id自增长,Employee_name、Create_Date为要插入数据的字段,EFFE_Tag默认值1,Drawing_Type默认值为A,

写了个触发器设置id大于3就不能插入了,但是没生效,大佬们帮看看是不是写法的问题。

触发器是这么写的:

USE [RD_Drawing]

GO

/****** Object:  Trigger [dbo].[trg_check_id_max]    Script Date: 2024/6/18 11:43:53 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

ALTER TRIGGER [dbo].[trg_check_id_max]

ON [dbo].[DrawingNo_A]

INSTEAD OF INSERT

AS

BEGIN

    SET NOCOUNT ON;

    IF EXISTS (SELECT 1 FROM inserted WHERE ID > 3)

    BEGIN

        RAISERROR('Inserted ID is greater than the maximum allowed value.', 16, 1);

        RETURN;

    END

 

    -- 如果检查通过,则正常插入数据

    INSERT INTO DrawingNo_A(Employee_name,Create_Date)

    SELECT Employee_name,Create_Date FROM inserted

END

SQL 被迫营业的小白 发布于 2024-6-18 11:54
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共1回答
最佳回答
0
用户k6280494Lv6资深互助
发布于2024-6-18 11:58

你的触发器有几个问题需要修正:

  1. INSTEAD OF INSERT 触发器通常用于视图,而不是表。对于表,你应该使用 AFTER INSERT 或 INSTEAD OF INSERT(但后者通常仅在视图中使用)。但是,因为你想阻止插入,你应该使用 AFTER INSERT 触发器来检查插入的记录,并在必要时回滚事务。但是,请注意,你不能直接在 AFTER INSERT 触发器中阻止插入,因为数据已经插入到表中。相反,你可以使用 THROW 语句来引发一个异常,这会使插入失败。

  2. 你的触发器尝试从 inserted 表中检查 ID 的值,但是因为你设置了 ID 为自增长,所以在插入时通常不会指定 ID 的值。因此,你的检查可能永远不会为真。但是,如果你确实想要基于某种逻辑阻止插入(例如,基于已经存在的其他记录),你需要重新考虑你的逻辑。

  3. 如果你想阻止具有特定 ID 的插入(尽管这在自增长字段的情况下可能不常见),你可能需要在插入之前检查是否允许该 ID。这可以通过应用程序逻辑、存储过程或另一个触发器(在插入之前触发)来实现。

但是,基于你的当前需求,如果你想在插入时检查自增长 ID 是否大于3(这实际上是不可能的,因为 ID 是自增长的,并且每次插入时都会自动递增),你可能需要重新考虑你的设计。

但是,如果你只是想在插入时引发一个错误(尽管这不是基于 ID 的值),你可以这样做:

sql复制代码

USE [RD_Drawing]
GO
ALTER TRIGGER [dbo].[trg_check_id_max]
ON [dbo].[DrawingNo_A]
AFTER INSERT  
AS  
BEGIN  
SET NOCOUNT ON;
-- 注意:这里只是一个示例,因为我们不能基于自增长的ID值来阻止插入  
-- 你可以根据其他逻辑或条件来引发错误  
THROW 51000, '示例错误:插入操作被阻止', 1;
-- 注意:以下代码在触发器中是不必要的,因为我们已经阻止了插入  
-- 并且数据已经插入到表中(在AFTER INSERT触发器中)  
-- INSERT INTO DrawingNo_A(Employee_name,Create_Date)  
-- SELECT Employee_name,Create_Date FROM inserted  
END

但是,请记住,上述触发器只是一个示例,用于演示如何在 AFTER INSERT 触发器中引发错误。根据你的实际需求,你可能需要修改或扩展它。

  • 2关注人数
  • 44浏览人数
  • 最后回答于:2024-6-18 11:58
    请选择关闭问题的原因
    确定 取消
    返回顶部