首页 > 解决方案 > Oracle - 验证表是否存在与具有表名值的列同名

问题描述

我们有一个表,它的 TABLE_NAME 列在相同的方案中包含真实的表名

我们使用表名值来创建动态 SQL 插入

可以验证这些名称以保持有效的表名吗?

例如,如果有人重命名列 TABLE_NAME 中存在的表,以异常或其他方式发出警报(类似于约束/键)?

标签: oracleconstraintstablename

解决方案


我认为您可能会使用 DDL 触发器来引发错误或使用 dbms_output 来获取警报

像这样的东西(更新到你自己的场景

SQL> create table  my_table_list ( c1 varchar2(1) ) ;

Table created.

SQL> insert into my_table_list values ( 'T' ) ;

1 row created.

SQL>  create table t ( c1 number ) ;

Table created.

然后我们在模式上使用 DDL 触发器

create or replace trigger audit_ddl_trg after rename on schema
declare
vcounter pls_integer;
begin
  if (ora_sysevent='RENAME')
  then
      select count(*) into vcounter from cpl_rep.my_table_list where c1 = upper(ora_dict_obj_name);
      if vcounter > 0 
      then 
        raise_application_error(-20001, 'Rename not allowed. Table does not exist');
      end if;
 end if;
end;
/

SQL> rename x to t;

Table renamed.

SQL> rename t to x ;
rename t to x
*
ERROR at line 1:
ORA-04088: error during execution of trigger 'CPL_REP.AUDIT_DDL_TRG'
ORA-00604: error occurred at recursive SQL level 1
ORA-20001: Rename not allowed. Table does not exist
ORA-06512: at line 9

它可以改进以控制更多的东西,但我认为这涵盖了你的问题。


推荐阅读