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 - 验证表是不是存在与具有表名值的列同名的主要内容,如果未能解决你的问题,请参考以下文章