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先に進む前に行数をチェックして、トリガー内で強制することを検討する必要があります。アプリケーション ロジックが制限されているからといって、アプリケーション ロジックの制御外で発生する挿入に対してこのトリガーが起動しない、またはアプリケーション ロジックにバグが発生しないというわけではありません。

編集

要求元のアプリケーションが接続文字列によって "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'または、ログインによって識別される場合は、チェックするか、同様のことを行うことができます...

于 2012-06-09T15:45:50.710 に答える