2013-09-24 26 views
0

我有一個通用的clr觸發器,可以在插入,更新,刪除時將其附加到不同的表。 例如檢索在clr中觸發觸發器的sqlobject

[Microsoft.SqlServer.Server.SqlTrigger(Event = "FOR UPDATE, INSERT, DELETE")] 
public static void TriggerHandle() 
{ 

    DataTable dataTable = new DataTable("Test"); 
    SqlTriggerContext myContext = SqlContext.TriggerContext; 

    try 
    { 
     using (SqlConnection conn = new SqlConnection(CONNECTION_STRING)) 
     { 
      conn.Open(); 
      SqlCommand sqlComm = new SqlCommand(); 

      sqlComm.Connection = conn; 

      switch (myContext.TriggerAction) 
      { 
       case TriggerAction.Insert: 
        sqlComm.CommandText = "Select *,'inserted' as operation from inserted"; 
        break; 

       case TriggerAction.Update: 
        sqlComm.CommandText = "Select *,'updated' as operation from inserted"; 

        break; 

       case TriggerAction.Delete: 
        sqlComm.CommandText = "Select *,'deleted' as operation from deleted"; 
        break; 

      } 
      dataTable.Load(sqlComm.ExecuteReader(), LoadOption.Upsert); 
      SqlContext.Pipe.Send(String.Format("The datatable is populated with {0} rows ", dataTable.Rows.Count.ToString())); 


     } 

    } 

...所以它不是特定的某個表。我怎麼才能找到,在clr觸發器,這是由觸發器更新的sql對象?

回答

0

不,我發現了另一種方式: 基本上你需要一個以前的觸發會話的上下文信息設置爲某個值(例如)

Create TRIGGER [dbo].[SET_MyContext_CONTEXT_INFO] 
ON [dbo].[MyTable] 
AFTER INSERT,DELETE,UPDATE 
AS 
BEGIN 
DECLARE @Ctx varbinary(128) 
SELECT @Ctx = CONVERT(varbinary(128), 'MyTable') 
SET CONTEXT_INFO @Ctx 
END 

GO 
EXEC sp_settriggerorder @triggername=N'[dbo].[SET_MyContext_CONTEXT_INFO]',@order=N'First', @stmttype=N'DELETE' 
GO 
EXEC sp_settriggerorder @triggername=N'[dbo].[SET_MyContext_CONTEXT_INFO]', @order=N'First', @stmttype=N'INSERT' 
GO 
EXEC sp_settriggerorder @triggername=N'[dbo].[SET_MyContext_CONTEXT_INFO]', @order=N'First', @stmttype=N'UPDATE' 
GO 

然後clr觸發器可以訪問上下文來檢索此值並找出表。缺點(如果存在的話)是,如果在同一個會話&事務&聲明期間,具有這些觸發器的兩個表是修改對象,我不太確定此上下文是否指向正確的表(例如,視圖)。但在最常見的情況下,當表格以某種方式相繼更新時,它可以正常工作。

0

希望這有助於:

SELECT OBJECT_NAME(parent_object_id) [object] 
FROM sys.objects 
WHERE name = OBJECT_NAME(@@PROCID)