当前位置: 首页 > 面试题库 >

如何在SQL Server的触发器中编辑INSERT的值?

贺正祥
2023-03-14
问题内容

我有桌子 Tb

ID | Name   | Desc
-------------------------
 1 | Sample | sample desc

我想在INSERT上创建一个触发器,该触发器将更改inserting的值Desc,例如:

INSERT INTO Tb(Name, Desc) VALUES ('x', 'y')

将导致

ID | Name   | Desc
-------------------------
 1 | Sample | sample desc
 2 | x      | Y edited

在上面的示例中,我得到了插入的值,将其Desc更改为大写并添加edited到末尾。

这就是我所需要的,获取Desc要插入的内容并对其进行修改。

我怎样才能做到这一点?

插入更新后处理它是否更好?还是使用INSTEAD OF INSERT进行触发,并在表结构每次更改时对其进行修改?


问题答案:

使用插入后触发器。从inserted伪表连接到Tb主键上。然后更新desc的值。类似于:(但可能无法编译)

CREATE TRIGGER TbFixTb_Trg 
ON  Tb  
AFTER INSERT 
AS  
BEGIN 
    UPDATE Tb
    SET DESC = SomeTransformationOf(i.DESC)
    FROM Tb
    INNER JOIN inserted i on i.Id = Tb.Id
END  
GO

此触发发生在插入发生之后但insert语句完成之前。因此,新的,不正确的值已放置在目标表中。添加,删除列等时,无需更改此触发器。

警告
触发完整性约束是在触发触发器之后执行的。因此,您不能施加检查约束来强制使用DESC的正确形式。因为这将导致语句在触发器有机会修复任何内容之前失败。(请在依赖之前仔细检查此段。自从我编写触发器以来已经有一段时间了。)



 类似资料:
  • 问题内容: 我有一个包含URL和代表其参数的字符串的表。问题是我希望url和parameterstring是表的唯一约束-aka没有条目可以具有相同的url AND parameter string。参数字符串可以是任意长度(长于800bytes左右,这是MySql键的最大长度,因此我不能使用Unique(url,params),因为它会引发错误…)。 我曾考虑过使用触发器来执行此操作,但是如果触

  • 本文向大家介绍MySQL触发器 Update触发Insert失败,包括了MySQL触发器 Update触发Insert失败的使用技巧和注意事项,需要的朋友参考一下 今天工作需要,想要实现将仅对状态更新的表进行历史记录显示,于是考虑在原表中建立触发器,将更新的内容同时写入另一张表 于是进行测试 执行触发器语句,报错,报错内容如下: 分析,由于访问工具HediSQL,导致无法正常创建触发器,相同语句,

  • 问题内容: 我的容器中包含所有网站代码。 我的Dockerfile使用git下载代码,并将其作为映像的一部分,以便更轻松地部署到生产环境。 但是,如何在开发中编辑代码?我认为使用卷是解决方案,例如:。但是它将覆盖容器中的目录。如果是我第一次运行它,它将清空它,因为主机中没有任何东西。因此,我在Dockerfile中所做的一切都丢失了。 我还希望在应用程序的不同版本之间共享目录和文件,例如:。这是专

  • 问题内容: 我在一个表中有触发器,并且想在插入,更新或删除行时读取值。怎么做?下面的代码不起作用,出现错误 问题答案: 请注意,其含义与相同,并给出每一行的每种组合。我怀疑这就是你想要的。 这样的事情可能会帮助您入门… 然后根据您要执行的操作,使用或引用您感兴趣的表,等等。 最后,请注意和是 表, 并且可以(并且确实)包含多个记录。 如果您一次插入10条记录,该表将包含所有10条记录。删除和表也​

  • 问题内容: 我们正在执行向SQL Server的数据库迁移,并且为了支持旧版应用程序,我们在SQL Server表上定义了视图,这些视图按照旧版应用程序的期望显示数据。 但是,当字段可能具有默认值时,我们现在遇到了在这些视图上定义的INSTEAD OF INSERT触发器的麻烦。 我会举一个例子。 数据库中的表具有3个字段,a,b和c。c是全新的,旧版应用程序对此一无所知,因此我们也有一个包含2个

  • 我正在我的网站上使用Ace编辑器(到目前为止已经很棒了!)。我需要捕捉编辑更改的每一个时刻的一些文本。我给编辑器的id是“ACE_JavaScript_Editor”。当我使用: 每当我向编辑器添加文本时,它就会激发,但当我在编辑器中删除文本时,它不会激发。对于一个看似简单的问题,我还没有找到一个优雅的解决方案。根据我的经验和我在网上读到的东西,“KeyUp”和“KeyDown”在Ace edit