你的语法有点不对劲。您在变量中有一个值,您不必为了访问它而组成一些表或别名。
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'
或类似的东西......