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