【问题标题】:How to truncate any table using its synonym in oracle?如何在 oracle 中使用其同义词截断任何表?
【发布时间】:2015-03-24 08:51:35
【问题描述】:

如何在 oracle 中使用同义词截断任何表?

-- in Server_A
Create Table table_a ( col int);

-- in server_B
CREATE SYNONYM syn_table_a FOR table_a@dblink_server_a;

--insert into
INSERT INTO syn_table_a values (1);

--Truncate
How to truncate table using synonym only?.

【问题讨论】:

  • 你不能。看我的回答。
  • 是的,我已经发现截断是不可能的。我正在使用删除操作来清空表。有没有其他选择。

标签: sql oracle truncate synonym


【解决方案1】:

不能在同义词上使用截断语句。

同义词不能用于删除表、删除视图或截断 表/集群语句。如果尝试这样做,则会导致 ORA-00942: 表或视图不存在

例如,

SQL> CREATE TABLE t(col NUMBER);

Table created.

SQL>
SQL> CREATE SYNONYM t_syn FOR t;

Synonym created.

SQL>
SQL> TRUNCATE TABLE t_syn;
TRUNCATE TABLE t_syn
               *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL>

【讨论】:

    【解决方案2】:

    您可以使用动态 SQL 来执行此操作,例如:

    declare
      d varchar2(1000);
    begin
      select 'TRUNCATE TABLE "' || table_owner || '"."' || table_name || '"'
      into d
      from all_synonyms
      where synonym_name = 'MYSYNONYM';
      execute immediate d;
    end;
    

    如果通过数据库链接访问表,这将不起作用。在这种情况下,您可以在执行截断的远程实例上创建一个过程,然后通过数据库链接调用该过程,例如

    begin
      truncate_my_table@dblinkname;
    end;
    

    【讨论】:

    • 表实际上在另一台服务器中,同义词正在使用 dblink。目前我正在使用删除操作来清空表。这有风险吗?
    • 更新了答案。您可以通过可以执行截断的数据库链接调用过程。
    • 我不确定您指的是什么风险。未经授权使用的风险?错误风险?性能问题的风险?
    • 我指的是使用删除而不是截断的任何可能的风险,而不是性能问题。
    • 除非您不了解删除和截断之间的根本区别,否则没有风险。
    【解决方案3】:

    在 Oracle 中,您还可以在尝试使用同义词删除/截断表时得到 ORA-14410。

    警报日志:

    ORA-00604: 递归 SQL 级别 1 发生错误 ORA-14410: 向通过同义词引用的表发出 RPI LOCK TABLE

    按照上述动态 SQl 删除/截断它。

    【讨论】:

    • 请查看此URL,这将有助于提升您的内容质量
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 2017-10-15
    • 1970-01-01
    • 2013-05-05
    • 2020-05-26
    相关资源
    最近更新 更多