【发布时间】:2011-04-04 13:17:15
【问题描述】:
我有桌子Tb
ID | Name | Desc
-------------------------
1 | Sample | sample desc
我想在 INSERT 上创建一个触发器,它将更改插入 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 做一个触发器,每次表结构发生变化时修改它?
【问题讨论】:
-
你不能用不同的方式来做这件事吗?我个人讨厌当我看到数据上发生奇怪的事情时,我终于意识到幽灵触发器正在做一些事情
-
我将使用它来解决来自我无权访问的代码的问题。它插入一个项目的
url,但它不会删除重音和特殊字符,我会为我做一个触发器。 -
这不是一个很难的概念,令我惊讶的是,Microsoft 无法提供像 Oracle 那样简单的功能,您可以在插入之前通过编辑 :NEW 值来修改任何值。即,如果我想在插入用户名之前总是将它们转换为上(假设由于某种原因我不能只在代码中这样做),你可以有一个插入前触发器:NEW.username := UPPER(:NEW.username )。但是在 SQL Server 中,您不能对 INSERTED 临时表中的值执行等效操作,这真的很糟糕。
-
是的,你可以。在instead of trigger 中,只需运行一个插入语句,将插入表中的所有列选择到真实表中,但修改您要设为upper 的列的select。例如,在代替插入触发器中,只需运行类似
insert into Table (a,b,c) select a, ToUpper(b), c from inserted的语句。微软技术将甲骨文从水中吹了出来。
标签: sql sql-server sql-server-2008 tsql triggers