Oracle - 验证表是不是存在与具有表名值的列同名

Posted

技术标签:

【中文标题】Oracle - 验证表是不是存在与具有表名值的列同名【英文标题】:Oracle - validate table exists with same name with column with table name valueOracle - 验证表是否存在与具有表名值的列同名 【发布时间】:2020-07-27 12:56:55 【问题描述】:

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

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

是否可以验证这些名称以包含有效的表名?

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

【问题讨论】:

让我理解,如果有人试图用您的表中存在的另一个名称重命名表,那么会引发异常?但是它们在不同的模式中这些表对吗?我的意思是,这些表是不是真正的物理表? @RobertoHernandez 相同的方案,真实的表,它们的名字也被保存为不同表中的值,我们使用值来创建动态 SQL 插入 那么如果有人用您的表中存在的名称重命名表,您想引发错误? @RobertoHernandez 确切地说,如果不是以某种方式提醒它 那么我认为您需要一个 DDL 触发器。让我在答案中告诉你 【参考方案1】:

我认为您可能会使用 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

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

【讨论】:

以上是关于Oracle - 验证表是不是存在与具有表名值的列同名的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 删表前验证表名是否存在并且删除

在 oracle 中对具有空值的列求和

oracle修改表名和列名的多种方式

比较 SQL 中的 Oracle 表列

Oracle SQL 从执行计划中检索具有表名的列名作为表

怎么显示Oracle数据库表中的列