在 Oracle 中注册 XML 模式 - 如何摆脱剩余对象

Posted

技术标签:

【中文标题】在 Oracle 中注册 XML 模式 - 如何摆脱剩余对象【英文标题】:Registering XML Schemas in Oracle - how to get rid of leftover objects 【发布时间】:2010-01-13 18:40:47 【问题描述】:

前几天我尝试在 Oracle 中注册一个模式来验证 XML 文档。我使用的代码相当简单:

dbms_xmlschema.registerSchema(schemaURL => 'http://www.myCompany.com/schema',
                              schemaDoc => :schemaCLOB);

一开始,就验证而言,一切似乎都运行良好。不过我注意到,有几十个新的数据库对象:表、触发器和类型(一些向下的表和触发器,但可能有数百种类型)。 我试图像这样删除架构:

dbms_xmlschema.deleteSchema(schemaURL => 'http://www.myCompany.ca/schema',
                            delete_option => dbms_xmlschema.DELETE_INVALIDATE);

这取消了架构的注册,但所有对象都被留下了。

我的 RTFM 有点太晚了,发现额外的对象是通过在 registerSchema 调用中保留默认值来创建的,所以我意识到我必须手动删除额外的对象。

现在,当我尝试删除对象时,Oracle 告诉我它们不存在。我无法从中选择,我的 IDE (PL/SQL Developer) 将它们显示为无效(它们旁边有一个红色的小“X”)。我在all_tables 中也找不到关于这些表的任何信息。我该如何摆脱这些?

【问题讨论】:

【参考方案1】:

解决方案是:从前一天的备份中恢复。将来,我将始终将gentablesgentypes 设置为FALSE,并使用DELETE_CASCADE_FORCE 删除。任何东西都不起作用,我可能会发布一个新问题。

【讨论】:

【参考方案2】:

我可能遗漏了一些明显的东西,但看看documentation,你能不使用 DELETE_CASCADE 或 DELETE_CASCADE_FORCE 选项吗?

【讨论】:

理论上,是的,这可能就是我接下来要做的(以及对 gentables 和 gentypes 使用 FALSE)。我尝试运行我的删除脚本并尝试了这两个选项。它运行了一个多小时(我认为接近 2 小时),DBA 现在告诉我要杀死它,他会看看他是否可以清除这些东西。 可以访问metalink?如果是这样,请检查您是否受到以下影响:错误 8498273:DBMS_XMLSCHEMA.DELETESCHEMA 永远挂起或错误 3581743:DBMS_XMLSCHEMA.DELETESCHEMA FAILED LEAVING SCHEMA OBJECTS THAT CAN'T BE DELETED 正如 Marco 所说,它是 Oracle 的支持站点。不幸的是,由于 metalink 合同中的条款,我不允许发布错误的更多详细信息。【参考方案3】:

Metalink 是 Oracle 的支持站点 (http://support.oracle.com),但您需要一个客户支持 ID(实体标识符)才能进入受保护的站点。

如果在 11g 上使用 DBMS_XMLSCHEMA.PURGESCHEMA 来删除对象。如果在 10gRx 上使用

dbms_xmlschema.deleteSchema(schemaURL => 'http://www.myCompany.ca/schema', delete_option => dbms_xmlschema.DELETE_CASCADE_FORCE);

dbms_xmlschema.deleteSchema('http://www.myCompany.ca/schema',4);

如果在使用强制删除后这无助于反弹数据库,请重试。如果这没有帮助,请通过基于 user_xml_schema 的删除语句删除架构(不支持最后一个选项)。

【讨论】:

我们这里是 10.2g。很可能我们将从星期一开始从我的架构的备份中恢复(如果我这样做的话,不会有重大损失)。我什至不确定如果我要手动删除模式,我会从哪里删除,基于 user_xml_schemas。

以上是关于在 Oracle 中注册 XML 模式 - 如何摆脱剩余对象的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL Developer 从包中删除模式名称

如何在 oracle 中更新包含 XML 数据的 blob 列

如何在 Oracle SQL 中的 XML 标记中进行搜索?

如何在一个 Spring 应用程序的 web.xml 中注册多个 servlet

如何将 XML 数据存储到 Oracle 表中

如何在 Oracle SQL 中搜索特定的 XML 值?