暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ORA-02021 DDL operations are not allowed on a remote database

原创 不吃草的牛_Nick 2022-11-21
1587

oerr ora 02021
02021, 00000, "DDL operations are not allowed on a remote database"
// *Cause: An attempt was made to use a DDL operation on a remote database.
// For example, "CREATE TABLE tablename@remotedbname ...".
// *Action: To alter the remote database structure, you must connect to the
// remote database with the appropriate privileges.


1、创建名称为 to_ces 的 DATABASE LINK,计划在对应的DBLINK下面创建表AC01备份表,执行以下SQL报错,
提示 ORA-02021:不允许对远程数据库进行DDL操作

CREATE TABLE AC01_BAK@to_ces AS SELECT * FROM AC01@to_ces;

2、解决方案
BEGIN
DBMS_UTILITY.EXEC_DDL_STATEMENT@此处是要操作的DBLINK('
此处是DDL操作语句,最外层用单引号,如果DDL操作语句中包含引号,一个单引号要替换为两个单引号
');
END;
/

exec dbms_utility.EXEC_DDL_STATEMENT@dblink_to_B('drop table test');

--在@to_ces 上创建AC01_BAK表
BEGIN
DBMS_UTILITY.EXEC_DDL_STATEMENT@to_ces('
CREATE TABLE AC01_BAK
AS
SELECT * FROM AC01
');
END;
/


--在@to_ces上删除AC01_BAK表
BEGIN
DBMS_UTILITY.EXEC_DDL_STATEMENT@to_ces('DROP TABLE AC01_BAK');
END;
/

------------
先在ces数据库上,建立一个类似如下的procedure:
create or replace procedure proc_truncate_remote_tab(p_tname in varchar2) as
BEGIN
EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || p_tname;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20001,SQLERRM);
end;
/

然后在test数据库上调用ces数据库上的这个procedure去完成这个truncate动作:
BEGIN proc_truncate_remote_tab@db_link('remote_table_name'); END;

begin
proc_truncate_remote_tab@to_ces('test');
end;
/


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论