Получить sqlobject, который запустил триггер в clr
У меня есть общий триггер clr, который может быть прикреплен к различным таблицам при вставке, обновлении, удалении. например
[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 обновляется триггером?
2 ответа
Нет, я нашел другой способ: в основном, вам нужен предыдущий триггер, чтобы установить информацию о контексте сеанса в какое-то значение (например)
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 может получить доступ к контексту, чтобы получить это значение и найти таблицу. Недостаток (если он существует) состоит в том, что если две таблицы с этими триггерами являются объектами модификации во время одного сеанса, транзакции и оператора, я не очень уверен, будет ли этот контекст указывать на правильную таблицу (например, обновление в представлении). Но в наиболее распространенных сценариях, когда таблицы обновляются одна за другой, все работает нормально.
Надеюсь это поможет:
SELECT OBJECT_NAME(parent_object_id) [object]
FROM sys.objects
WHERE name = OBJECT_NAME(@@PROCID)