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

5
如何在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?.

你不能这样做。请看我的回答。 - Lalit Kumar B
1
是的,我已经发现了truncate不可行。我正在使用删除操作来清空表格。有没有其他替代方法? - touchchandra
3个回答

3

截断语句不能用于同义词。

在删除表(drop table)、删除视图(drop view)或截断表/群集语句中,同义词是不能使用的。如果尝试这样做,则会导致错误代码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。目前我正在使用删除操作来清空表。这是一个风险吗? - touchchandra
1
更新的答案。您可以通过数据库链接调用一个过程来执行截断操作。 - Jeffrey Kemp
我不确定你指的是什么风险。未经授权使用的风险?错误的风险?性能问题的风险? - Jeffrey Kemp
1
我指的是使用delete而不是truncate可能存在的任何风险,除了性能问题。 - touchchandra
除非你不理解删除和截断之间的根本区别,否则没有风险。 - Jeffrey Kemp

-1
在Oracle中,当您尝试使用同义词删除/截断表时,也可能会出现ORA-14410错误。
警报日志:
ORA-00604:递归SQL级别1发生错误 ORA-14410:RPI LOCK TABLE发出到通过同义词引用的表
请按照上述动态SQL来删除/截断它。

请查看此链接,它会有助于提高您的内容质量。 - Willie Cheng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接