【问题标题】:SQL Server trigger for cascade insert用于级联插入的 SQL Server 触发器
【发布时间】:2015-03-31 13:54:50
【问题描述】:

我正在使用 2 个表:

  • WPCMA69_连接器
  • WPCMA70_ConnectorPocket

由于关系属性具有“更新”和“删除”级联,我正在开发一个触发器来处理插入。 ConnectorName 是我想在 PCMA69 上执行插入命令后自动从 PCMA69 表插入到 PCMA70 表的公共字段。

  • PCMA69_ConnectorName_N

    • (PK,nvarchar(50,not null)
  • PCMA70_ConnectorName_N

    • (FK,nvarchar(50),not null)

这是我尝试过的:

alter trigger trigConnector
ON dbo.WPCMA69_Connector
FOR INSERT 
AS
BEGIN
   SET NOCOUNT ON

   DECLARE @ConnectorName nvarchar(50)

   SELECT @Connectorname = PCMA69_ConnectorName_N 
   FROM inserted

   INSERT INTO WPCMA70_ConnectorPocket 
   VALUES (@ConnectorName)
END 

但是,我得到了错误:

消息 213,级别 16,状态 1,过程 trigConnector,第 9 行
列名或提供的值的数量与表定义不匹配。

【问题讨论】:

标签: sql-server triggers insert


【解决方案1】:

你需要按照这些思路做一些事情。

insert into WPCMA70_ConnectorPocket (WhateverYourColumnIsHere) 
Select PCMA69_ConnectorName_N from inserted

如果您在一个操作中有超过 1 行,则当您涉及标量变量时,它只会选取其中一行。

【讨论】:

  • 谢谢。我有另一个相同的问题,我认为不需要单独的问题。如果我要插入的表中的列不能为空,那么插入语句中不涉及,我该如何解决?
  • 你不能。当列具有 NOT NULL 约束时,您必须为该列期间提供一个值。没有解决办法。这就是非空约束的意义所在。
  • 好的。这就说得通了。我只是好奇是否有解决方法。
【解决方案2】:
insert into WPCMA70_ConnectorPocket (PCMA70_ConnectorName_N) 
values (@ConnectorName)

【讨论】:

  • 这解决了问题,但标量触发器的底层逻辑缺陷仍然存在。
猜你喜欢
  • 1970-01-01
  • 2014-08-23
  • 2013-11-09
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多