【发布时间】:2015-05-29 12:40:54
【问题描述】:
我已经在 Oracle 中使用 BizTalk 实现了数据库更改通知概念,但是当发生任何更改时,我没有收到 RowId 这是我的主要字段。我得到如下输出,
如何获取Row ID?
第二个问题是每当我的数据库中发生任何更改时,通知都不会出现,除非我在我的数据库中运行以下查询
grant change notification to UserName
我怎样才能使这些权限保持不变?
【问题讨论】:
我已经在 Oracle 中使用 BizTalk 实现了数据库更改通知概念,但是当发生任何更改时,我没有收到 RowId 这是我的主要字段。我得到如下输出,
如何获取Row ID?
第二个问题是每当我的数据库中发生任何更改时,通知都不会出现,除非我在我的数据库中运行以下查询
grant change notification to UserName
我怎样才能使这些权限保持不变?
【问题讨论】:
选项 3 是您需要启用的。
来自Registration Properties 使用数据库更改通知开发应用程序
注册属性
Oracle 数据库支持以下对象注册选项:
Purge On Notify 选项:在第一次更改通知后取消注册。
超时选项:指定时间间隔后的注册到期。
ROWIDs 选项:ROWIDs 更改的行是通知ROWID选项的一部分。可靠通知选项:默认情况下,通知在共享内存中生成。如果选择此选项,则会在持久数据库队列中生成通知。通知以原子方式与更改注册对象的事务一起排队。由于通知在数据库中是持久的,如果一个实例在生成通知后崩溃,它们可以在它随后重新启动时传递,或者如果运行 RAC,则由集群的幸存实例传递。 (注意:这里涉及到通知性能和可靠性之间的权衡。由于生成可靠通知时有 CPU 和 I/O 成本,如果需要更好的通知性能,建议选择默认内存选项)。
操作过滤器:能够收到特定操作的通知(例如,仅针对
INSERT和UPDATE的通知)。事务延迟:指定连续通知之间的计数。
如果选择了 ROWID 选项,则更改行的 ROWID 将作为通知的一部分发布。 ROWID 以外部字符串格式发布。根据通知中的 ROWID 信息,应用程序随后应该能够通过执行“SELECT * from table_name_from_notification where ROWID = rowid_from_notification”形式的查询来检索已更改行的内容。在常规堆表的情况下,ROWID 的长度为 18 个字符字节。在索引组织表 (IOT) 的情况下,ROWID 的长度取决于主键的大小,因此可能大于 18 个字节。
ROWID 通知是分层汇总的。如果服务器端没有足够的内存来保存 ROWID,则通知可能会汇总到 FULL-TABLE-NOTIFICATION 中(通知描述符中的一个特殊标志是为此目的而保留的)。当收到这样的通知时,应用程序必须保守地假设整个表(即所有行)可能已被修改。 ROWID 不是此类通知的一部分。如果由于 ROWID 导致的总共享内存消耗太大(超过动态共享池大小的 1%),或者如果在事务中的单个注册对象中修改了太多行(大约超过 80 ) 或者,如果 IOT 的修改行的逻辑 ROWID 的总长度太大(大约超过 1800 字节。)。
【讨论】:
第一个问题的答案很简单: 您需要在 BizTalk 接收位置中选择添加 ROWID,如下所示:
SELECT ROWID, [your other column names here] FROM TIACODEV.EMP_DETAILS [WHERE if you need it]
不确定如何解决您的第二个问题
【讨论】: