我正在C#中创建一个相对简单的SQL。
此CLR的工作是将事件发布到Azure事件网格主题。
我希望能够从任意多个表的触发器中调用这个特定的CLR (实际上很少)。
给定下面的核心代码,如何准确地检索导致/触发触发器的表的名称?我一点也不知道从哪里开始。
我希望能够删除SqlTrigger属性,并以某种方式访问var table属性的表名。
// I Would like to leave the attribute commented out
//
//[Microsoft.SqlServer.Server.SqlTrigger(Name = "PublishToEventGridTrigger",
// Target = "NamesOfThings", Event = "FOR UPDATE, INSERT, DELETE")]
public static void PublishToEventGridTrigger()
{
// TODO - How should these settings be handled?
// Not sure if config files are accessible... To test..
// ***************************************************************
string topicHost = "https://####.eventgrid.azure.net/api/events";
string topicKey = "####";
// TODO - Get Table name for this
var table = "How Do I set This";
string eventType = $"##.{table}.{SqlContext.TriggerContext.TriggerAction.ToString()}";
// ***************************************************************
try
{
// extract data involved in trigger
// Create the Event object
EventGridEvent evt = new EventGridEvent("QWDBEvent", eventType, new
TriggerData(SqlContext.TriggerContext, SqlContext.Pipe));
// Publish the event
Event.Publish(topicHost, topicKey, evt);
}
catch (Exception ex)
{
//TODO - how do we handle these through SQL CLR?
// Going with a fire-and-forget for now
SqlContext.Pipe.Send($"Failure firing {ex.Message}");
}
SqlContext.Pipe.Send($"Trigger fired");
}发布于 2020-02-04 17:06:17
这不是本地支持的,也不是非常容易实现的。实际上,我有一个模拟,但没有时间发表它。当然不是直接前进。现在,您可以看看这两个问题的答案:
SQL CLR Trigger - get source table
我会更新这个答案,当我得到我的解决方案清理和张贴。
但是,虽然您说只有几个表将被应用于此,但请记住触发器是在DML (甚至DDL)语句是其一部分的事务上下文中执行的。这有两个后果:
通过设置service来处理调用日志服务,您应该能够将DML/DLL操作与日志记录块分离开来。在这种情况下,您可以:
INSERTED和/或DELETED表收集任何其他信息以进行日志记录(在此之后,您将无法访问这些表;尽管您可以将这两个表中的数据重新打包为XML作为Service消息的一部分发送--例如SELECT * FROM inserted FOR XML RAW('ins'); )为Service排队发送消息,包括收集到的INSERTED消息
使用Service operations
的消息,执行SQLCLR存储过程,传递收集到的to触发器中的信息,以调用日志服务(无论是内部还是外部network))。
请记住(因为您提到了从INSERTED表和DELETED表中获得受影响的PK值),如果DML操作影响多行,这些表中可能有多个行(即,对于DML操作永远不要假设为一行)。
https://stackoverflow.com/questions/60060272
复制相似问题