我有一个表 ( OBJECTS_TO_UPDATE
),其中包含需要更新的几个对象,其中一些SYNONYMs
用于不再存在的对象。
我想创建一个查询来列出它们。但我被困住了。
我的表OBJECTS_TO_UPDATE
有这些列:
OBJECT_NAME
OBJECT_TYPE
OWNER
换句话说,我想做的事情是这样的:
- 我过滤我的
OBJECTS_TO_UPDATE
表OBJECT_TYPE = 'SYNONYM'
。 - 使用所有者和名称我可以
SYNONYM
进入ALL_SYNONYMS
. - 使用
TABLE_OWNER
andTABLE_NAME
并在 dba_objects 中搜索它,如果该对象不存在,则同义词不再有效。
我想使用所有这些条件编写查询,但我遇到了问题。
select *
from OBJECTS_TO_UPDATE o2u
where o2u.OBJECT_TYPE = 'SYNONYM' and NOT EXISTS (
--select * from dba_objects dobj
--where dobj.OWNER
select * from ALL_SYNONYMS syn
where syn.OWNER = o2u.OWNER and syn.SYNONYM_NAME = o2u.OBJECT_NAME)
我对在NOT EXISTS
.
我怎样才能达到我所需要的?我有 DBA 权限。
另外,这是实现我想要的最佳方式吗?也许我应该更直接地使用其他一些观点。
您可以查询 和的
ALL_OBJECTS
视图。但是 all_objects 状态是根据它所引用的对象的状态设置的。同义词,如果基础表消失,它们不会自动失效。所以使用的列不可靠。object_type = 'SYNONYM'
status != 'VALID'
STATUS
ALL_OBJECTS
尝试使用此查询:
我无法使用 BriteSponge 建议的选项,因为 ALL_OBJECTS 中 COLUMN Status 的值似乎不可靠。我可以找到一个状态为 VALID 但它指向的对象不存在的 SYNONYM。
我要更新的对象列表是 OBJECTS_TO_UPDATE 表。我可以使用以下查询列出 OBJECTS_TO_UPDATE 表中指向不再存在的对象的所有同义词: