如何在插入时在 SQL Server 中创建触发器?
Posted
技术标签:
【中文标题】如何在插入时在 SQL Server 中创建触发器?【英文标题】:How can I create a trigger in SQL Server on insert? 【发布时间】:2013-12-01 20:42:35 【问题描述】:我想在 SQL Server 2012 中创建一个触发器,当我将一行插入特定表时激活该触发器。
触发器必须在特定列中插入一个值,在我插入新行的同一个表和行中。
只有当我插入的行中的特定列没有值时,触发器才必须激活,即。空。
假设我正在插入:
表:car
列:car_make | car_price | car_img
如果我在插入中提供所有值:
car_make | car_price | car_img
触发器不得激活
但是,如果我只插入 2 列的值:
car_make | car_price
car_img
值为 null,则触发器必须激活并执行以下操作:
car_img
列中插入预定义值
PS。我必须使用触发器,它用于分配。我不能使用默认值。
【问题讨论】:
您需要为表中的所有列设置默认值,而不是这个简单要求的触发器。 @MuhammedAli 我必须使用触发器,这是强制性的。这是一个任务。 触发这样一个简单的要求真的是过度杀戮,但无论如何请看我的回答。 附注:如果您有FOR INSERT
触发器,它将始终触发 - 您不能选择性地根据您的数据让它触发(或不触发)。您可以做的是在触发器代码中检查这些条件并根据需要处理情况
【参考方案1】:
Create Trigger tr_ForInserts_car
ON dbo.car
FOR INSERT
AS
BEGIN
SET NOCOUNT ON;
UPDATE Car
SET car_make = /*Your Default Value*/
WHERE car_make IS NULL
UPDATE Car
SET car_price = /*Your Default Value*/
WHERE car_price IS NULL
UPDATE Car
SET car_img = /*Your Default Value*/
WHERE car_img IS NULL
END
编辑
我之前的建议是更新对应列为空的所有行,只更新新插入行的列请尝试以下操作
Create Trigger tr_ForInserts_car
ON dbo.car
FOR INSERT
AS
BEGIN
SET NOCOUNT ON;
UPDATE Car
SET Car.car_make = /*Your Default Value*/
FROM Car INNER JOIN inserted
ON Car.PrimaryKey = inserted.PrimaryKey
WHERE Car.car_make IS NULL
UPDATE Car
SET Car.car_price = /*Your Default Value*/
FROM Car INNER JOIN inserted
ON Car.PrimaryKey = inserted.PrimaryKey
WHERE Car.car_price IS NULL
UPDATE Car
SET Car.car_img = /*Your Default Value*/
FROM Car INNER JOIN inserted
ON Car.PrimaryKey = inserted.PrimaryKey
WHERE Car.car_img IS NULL
END
【讨论】:
但这会更新 整个 表 - 不仅仅是正在插入的行(或行)......您可能想要加入Inserted
以某种方式将您的更新限制为当前实际插入的那些行 ....
@marc_s 是的,这是正确的,但这是 OP 想要的,奇怪的要求,但你能说什么:)
@MuhammedAli 我知道这有点奇怪,而且没有任何意义,但这是学校作业的要求。他们只是希望我们为了使用触发器而使用触发器。
@marc_s 看看现在我已经更新我的答案只处理新插入的行。
@MuhammedAli 好吧,如果我不能在某个地方学习它,我就不能自己做。 *** 给了我更可靠和经过筛选的答案,这比你在互联网上找到的随机东西要好得多。 *** 有专家社区不断检查信息是否正确,:-) 所以我猜信息的质量比在互联网上搜索要高。以上是关于如何在插入时在 SQL Server 中创建触发器?的主要内容,如果未能解决你的问题,请参考以下文章
列值更改的 T-SQL (SQL Server 2016) 触发器,在插入