【问题标题】:Grant command on a synonym throws ORA-01775 error同义词上的授予命令引发 ORA-01775 错误
【发布时间】:2019-08-22 12:57:37
【问题描述】:

我正在尝试在触发器上创建同义词,然后尝试在同义词上为特定用户授予所有权限。它抛出一个错误: ORA-01775: 同义词循环链

下面是我的代码。谁能指出我错的正确方向!

create table emp(emp_name varchar(20));
create or replace trigger trg_test
before insert on emp
begin
null;
end;

create or replace public synonym  trg_test for trg_test;
GRANT ALL ON trg_test TO USER1;

【问题讨论】:

  • 为什么要为触发器创建同义词?这实际上没有任何意义——触发器将为表上的每个插入触发——无论谁执行了插入。只需将表上的INSERT 授予USER1,就可以了。
  • 关于您收到的错误消息:如果您指定触发器的架构,它可能会起作用,即create or replace public synonym trg_test for myschema.trg_test;

标签: oracle synonym


【解决方案1】:

如果您执行了以下任务,则会收到错误消息:

CREATE OR REPLACE public SYNONYM TRG_TEST FOR TRG_TEST;
GRANT ALL ON TRG_TEST TO USER1; --this will give error

Error:
GRANT ALL ON TRG_TEST TO USER1
Error report -
ORA-01775: looping chain of synonyms
01775. 00000 -  "looping chain of synonyms"
*Cause:    
*Action:

如果按照@Frank Schmitt 的建议,您将模式名称放在触发器名称之前的同义词中,那么您也会得到相同的错误:

CREATE OR REPLACE public SYNONYM TRG_TEST FOR schema.TRG_TEST;
GRANT ALL ON TRG_TEST TO USER1; --this will give error

Error:
GRANT ALL ON TRG_TEST TO USER1
Error report -
ORA-01775: looping chain of synonyms
01775. 00000 -  "looping chain of synonyms"
*Cause:    
*Action:

让我澄清一下,此错误消息具有误导性。

您可以在 oracle 中创建几乎任何对象的同义词,无论其类型如何(表、视图、序列等)。 Oracle 不知道同义词背后的对象类型是什么。

现在,在我们的例子中,如果 Oracle 知道将在 TRIGGER 上执行 GRANT,那么它将给出不同的错误。

-- actual error
drop public synonym TRG_TEST;
GRANT ALL ON TRG_TEST TO USER1;

Error starting at line : 16 in command -
GRANT ALL ON TRG_TEST TO USER1
Error report -
ORA-00942: table or view does not exist
00942. 00000 -  "table or view does not exist"
*Cause:    
*Action:

所以结论是:您不能为trigger 提供资助。哪有这回事。每当在创建trigger 的表上完成触发事件时,Triggers 就会自动触发。您只需要授予该表的权限即可。

干杯!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多