oracle - Oracle - 验证表是否存在与具有表名值的列同名
问题描述
我们有一个表,它的 TABLE_NAME 列在相同的方案中包含真实的表名
我们使用表名值来创建动态 SQL 插入
可以验证这些名称以保持有效的表名吗?
例如,如果有人重命名列 TABLE_NAME 中存在的表,以异常或其他方式发出警报(类似于约束/键)?
解决方案
我认为您可能会使用 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
它可以改进以控制更多的东西,但我认为这涵盖了你的问题。
推荐阅读
- vbscript - 如何使用 VBS 获取 Rest API
- c# - C# if 语句约定
- docker - 为什么 docker compose 试图提取图像而不是创建新图像?
- javascript - 为什么这段代码给了我“Uncaught TypeError: Cannot read properties of null (reading 'push')”错误?
- ios - SwiftUI 像内置导航一样滑过动画
- python - pip 安装我的包,但我无法导入它 Python 3.10
- javascript - 使用手动递归 setTimeout 而不是 @Interval 在 NestJS 中调度重复发生的任务
- typescript - 如何在 TypeScript 中遍历递归生成器?
- javascript - 由于 SSL 错误,Android Webview 应用程序无法在 HTTPS 上显示任何内容
- sql - DBeaver SQL 是否有恢复查询的选项?