【发布时间】:2020-05-20 10:49:55
【问题描述】:
我正在用 C# 创建一个相对简单的 SQL CLR。
此 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");
}
【问题讨论】:
-
这不是本机支持的,也不容易实现。我实际上有一个模型可以做到,但还没有时间发布它。当然不是直截了当。此外,这个问题至少与其他 1 或 2 个问题重复,但我需要搜索它们,因为我已经有一段时间没有看到它们了。
-
@SolomonRutzky- 非常感谢。我确实在这里看到了其他几个问题,但没有定义任何实际答案。任何其他链接都会很棒。如果完成起来很痛苦,那么我会重新考虑并在需要时为每个触发器使用 CLR。只是希望有一个通用的事件调度程序。
-
您可能应该将其设为 CLR 存储过程,然后从 TSQL 触发器中调用它并传入任何必需的参数。
-
@DavidBrowne-Microsoft - 哦。这似乎是一个合理的想法。谢谢。我会试一试。
-
@DarrenWainwright 为此您需要访问
INSERTED和DELETED表吗?或者只是想知道事件发生了以及它在哪张桌子上?
标签: c# sql-server database-trigger sqlclr azure-eventgrid