あなたの構文は少しずれています。変数には値があり、それにアクセスするためにテーブルやエイリアスを作成する必要はありません。
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
先に進む前に行数をチェックして、トリガー内で強制することを検討する必要があります。アプリケーション ロジックが制限されているからといって、アプリケーション ロジックの制御外で発生する挿入に対してこのトリガーが起動しない、またはアプリケーション ロジックにバグが発生しないというわけではありません。
編集
要求元のアプリケーションが接続文字列によって "My Cool Application" として識別される場合、ロジックを完全にバイパスするには:
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'
または、ログインによって識別される場合は、チェックするか、同様のことを行うことができます...