Oracle - 验证 table 是否与具有 table 名称值的列同名
Oracle - validate table exists with same name with column with table name value
我们有 table,其中有 TABLE_NAME 列,在同一方案中包含真实的 tables 名称
我们使用 table 的名称值来创建动态 SQL 插入
能否验证这些名称是否包含有效的 table 名称?
例如,如果有人重命名存在于列 TABLE_NAME 中的 table,以使用 ora 异常或其他方式提醒(类似于 constraint/key)?
我认为您可能会使用 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
它可以改进以控制更多的东西,但我认为这涵盖了你的问题。
我们有 table,其中有 TABLE_NAME 列,在同一方案中包含真实的 tables 名称
我们使用 table 的名称值来创建动态 SQL 插入
能否验证这些名称是否包含有效的 table 名称?
例如,如果有人重命名存在于列 TABLE_NAME 中的 table,以使用 ora 异常或其他方式提醒(类似于 constraint/key)?
我认为您可能会使用 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
它可以改进以控制更多的东西,但我认为这涵盖了你的问题。