如何使用 SQL CLR 类型包装或观察
How to wrap or observe using SQL CLR types
我知道数据库触发器并且不寻求该选项。我想知道是否可以从中间件观察带有 reader 的 DB tables。
问题 - 是否有可能在数据库 table 上使用 C# 中的 SQL CLR 类型获得可观察包装器,例如我有table张票,table.
怎么看
不,SQLCLR 不提供执行此操作的任何特殊方法。
最好、最合适、且唯一的方法是通过触发器获得 table 修改通知。这就是他们要做的。您可以通过 DML 触发器捕获数据更改(对于 INSERT
、UPDATE
和 DELETE
操作),您可以通过 DDL 触发器捕获结构更改(对于 ALTER TABLE
、CREATE / ALTER / DROP TRIGGER
,和 CREATE / DROP INDEX
操作)。
您可以使用纯 T-SQL 或使用 SQLCLR 创建任一类型的触发器,尽管 SQLCLR 选项与 T-[ 相比没有太大优势=65=] 除了能够通过动态 SQL 访问 inserted
和 deleted
伪 table。使用 SQLCLR 触发器的另一个原因是,如果您只需要来自一个或两个伪 table 的所有行数据来进行一次操作。否则,如果您需要按行处理某些内容,您可以在 T-SQL 触发器中调用 SQLCLR 用户定义函数。
请记住,触发器是 DML 操作开始时内部创建的事务的一部分(如果当前没有活动事务)。这样,如果 DML 操作最终失败,触发器所做的任何更改都可以回滚。
如果您想要非常轻量级的通知,您可以执行以下操作之一,但请记住,两者都会回避交易(即无法收回未完成操作的通知)等等很容易导致误报(即从未提交的修改通知):
通过 sp_send_dbmail 发送电子邮件。这是异步的,因此不应对性能产生不利影响。但是您确实需要在触发器中将完整的数据修改报告格式化为字符串(可能是 HTML?),而不是附加查询结果,因为对电子邮件的查询将无法访问伪- tables.
使用 SQLCLR 将所需信息转储到文本文件。您只需要注意允许对文件的多个并发写入请求,否则并发 DML 语句将受到负面影响。
关于查询通知的快速说明,因为问题被标记为 SqlDependency:
查询通知在这里并不是很有用。除了关于哪些查询符合查询通知条件的限制列表外,它们仅表示特定查询的结果集已更改。因此,即使您为 SELECT * FROM table;
设置了简单的通知,它也不会告诉您 什么 具体改变了(即 INSERTED
and/or 中的行DELETED
伪 table 在触发器中可用)。尽管如此,如果您有兴趣阅读它们,这里有两个有用的链接:
我知道数据库触发器并且不寻求该选项。我想知道是否可以从中间件观察带有 reader 的 DB tables。
问题 - 是否有可能在数据库 table 上使用 C# 中的 SQL CLR 类型获得可观察包装器,例如我有table张票,table.
怎么看不,SQLCLR 不提供执行此操作的任何特殊方法。
最好、最合适、且唯一的方法是通过触发器获得 table 修改通知。这就是他们要做的。您可以通过 DML 触发器捕获数据更改(对于 INSERT
、UPDATE
和 DELETE
操作),您可以通过 DDL 触发器捕获结构更改(对于 ALTER TABLE
、CREATE / ALTER / DROP TRIGGER
,和 CREATE / DROP INDEX
操作)。
您可以使用纯 T-SQL 或使用 SQLCLR 创建任一类型的触发器,尽管 SQLCLR 选项与 T-[ 相比没有太大优势=65=] 除了能够通过动态 SQL 访问 inserted
和 deleted
伪 table。使用 SQLCLR 触发器的另一个原因是,如果您只需要来自一个或两个伪 table 的所有行数据来进行一次操作。否则,如果您需要按行处理某些内容,您可以在 T-SQL 触发器中调用 SQLCLR 用户定义函数。
请记住,触发器是 DML 操作开始时内部创建的事务的一部分(如果当前没有活动事务)。这样,如果 DML 操作最终失败,触发器所做的任何更改都可以回滚。
如果您想要非常轻量级的通知,您可以执行以下操作之一,但请记住,两者都会回避交易(即无法收回未完成操作的通知)等等很容易导致误报(即从未提交的修改通知):
通过 sp_send_dbmail 发送电子邮件。这是异步的,因此不应对性能产生不利影响。但是您确实需要在触发器中将完整的数据修改报告格式化为字符串(可能是 HTML?),而不是附加查询结果,因为对电子邮件的查询将无法访问伪- tables.
使用 SQLCLR 将所需信息转储到文本文件。您只需要注意允许对文件的多个并发写入请求,否则并发 DML 语句将受到负面影响。
关于查询通知的快速说明,因为问题被标记为 SqlDependency:
查询通知在这里并不是很有用。除了关于哪些查询符合查询通知条件的限制列表外,它们仅表示特定查询的结果集已更改。因此,即使您为 SELECT * FROM table;
设置了简单的通知,它也不会告诉您 什么 具体改变了(即 INSERTED
and/or 中的行DELETED
伪 table 在触发器中可用)。尽管如此,如果您有兴趣阅读它们,这里有两个有用的链接: