0

我正在尝试将过程的输出传递给触发器主体。下面是我对我认为可能是一个非常简单的答案的尝试。谢谢!

INSTEAD OF INSERT 
AS BEGIN
SET NOCOUNT ON; 

DECLARE @id INT, @num_ids INT; 
EXEC [dbo].[i14_get_ids] 2, 1, @id OUTPUT, @num_ids OUTPUT; 
INSERT dbo.tbl_Events(
Event_ID, Location_ID, Event_Group_ID, 
Protocol_Name, Start_Date, 
ObjectID
)
SELECT 
a.Event_ID, a.Location_ID, a.Event_Group_ID, 
a.Protocol_Name, a.Start_Date, 
b.ObjectID
From
(SELECT 
Event_ID, Location_ID, Event_Group_ID, 
Protocol_Name, Start_Date
--deosn't work    
--ObjectID as @id

    --**********************************
FROM inserted) AS a 
--doesn't work
    @id ;

end
4

1 回答 1

3

你的语法有点不对劲。您在变量中有一个值,您不必为了访问它而组成一些表或别名。

ALTER TRIGGER dbo.Name_Of_Trigger_You_Left_Out
ON dbo.Name_Of_Table_You_Left_Out
INSTEAD OF INSERT 
AS 
BEGIN
   SET NOCOUNT ON; 

   DECLARE @id INT, @num_ids INT; 

   EXEC [dbo].[i14_get_ids] 2, 1, @id OUTPUT, @num_ids OUTPUT; 

   INSERT dbo.tbl_Events
   (
      Event_ID, Location_ID, Event_Group_ID, 
      Protocol_Name, Start_Date, ObjectID
   )
   SELECT 
      Event_ID, Location_ID, Event_Group_ID, 
      Protocol_Name, Start_Date, ObjectID = @id
   FROM inserted;
END
GO

别名不是必需的ObjectID =,我只是想明确表明它是一个变量。您有ObjectID as @id-这是倒退的,您是在说“使用别名@id呈现列ObjectID”-您的真正意思是@id AS ObjectID-但同样,在这种情况下,它只是选择列表中包含的一个值,没有严格的需要在这里提供别名。

如果您打算仅依靠这种处理单行插入,您可能应该考虑通过inserted在继续之前检查行数来在触发器中强制执行该操作。仅仅因为应用程序逻辑受到限制并不意味着此触发器不会触发您的应用程序逻辑控制之外发生的插入,或者您的应用程序逻辑中永远不会出现错误。

编辑

如果请求的应用程序由其连接字符串标识为“我的酷应用程序”,则完全绕过逻辑:

ALTER TRIGGER dbo.Name_Of_Trigger_You_Left_Out
ON dbo.Name_Of_Table_You_Left_Out
INSTEAD OF INSERT 
AS 
BEGIN
   SET NOCOUNT ON; 

  IF NOT EXISTS 
  (
    SELECT 1 FROM sys.dm_exec_sessions 
    WHERE session_id = @@SPID
    AND program_name = 'My Cool Application'
  )
  BEGIN
    DECLARE @id INT, @num_ids INT; 

    EXEC [dbo].[i14_get_ids] 2, 1, @id OUTPUT, @num_ids OUTPUT; 

    INSERT dbo.tbl_Events
    (
       Event_ID, Location_ID, Event_Group_ID, 
       Protocol_Name, Start_Date, ObjectID
    )
    SELECT 
       Event_ID, Location_ID, Event_Group_ID, 
       Protocol_Name, Start_Date, ObjectID = @id
    FROM inserted;
  END
END
GO

或者,如果它是通过登录识别的,你可以检查IF SUSER_SNAME() <> 'MyMultiRowLogin'或类似的东西......

于 2012-06-09T15:45:50.710 回答