【问题标题】:Create user through procedure on another database via database link通过数据库链接在另一个数据库上创建用户
【发布时间】:2015-01-16 09:32:18
【问题描述】:

我已经使用数据库链接和存储过程在另一个数据库上创建了用户,但是在向新创建的用户授予权限时遇到了问题。

检查以下代码:

CREATE OR replace PROCEDURE Hostname10 (user_name   IN VARCHAR2,
                                        pass_word   IN VARCHAR2,
                                        table_space IN VARCHAR2,
                                        pro_file    IN VARCHAR2)
AS
BEGIN
    dbms_utility.Exec_ddl_statement@rahul2('CREATE USER '
                                           ||user_name
                                           ||' IDENTIFIED BY '
                                           ||pass_word
                                           ||' DEFAULT TABLESPACE '
                                           ||table_space
                                           || ' PROFILE '
                                           || pro_file
                                           || ' ACCOUNT UNLOCK');

dbms_utility.Exec_ddl_statement@rahul2('grant create table,create session,create view,create sequence,create procedure,create job,create synonym  to'
                                       ||user_name
                                       ||'');
END;

/ 

执行时出错:

Error:
Error report -
ORA-06550: line 1, column 7:
PLS-00201: identifier 'HOSTANAME10' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

【问题讨论】:

  • 代码正在使用匿名块,但它在过程中不起作用
  • 错误不是说程序不工作;它是说你没有正确调用这个过程。

标签: oracle stored-procedures permissions sql-grant database-link


【解决方案1】:

你的错误信息说:

PLS-00201: identifier 'HOSTANAME10' must be declared
                           ^

但是您的过程创建为Hostname10。所以这只是一个错字,当您尝试调用该过程时,您的名称中有一个额外的a

您在grant 调用中似乎也有一个错误,尽管您目前还没有走那么远;结尾是:

... create synonym  to'
                                   ||user_name
                                   ||'');

所以在生成的命令中to 和用户名之间不会有空格;这需要:

... create synonym  to '
                                   ||user_name);

在用户名之后连接空/空字符串没有做任何事情,所以我也冒昧地删除了它。

【讨论】:

  • @RahulJoshi - 你是什么意思?您尝试以Hostname10 而不是Hostaname10 执行它,但它仍然不起作用?或者您只是在过程中添加了空格,但仍然使用错误的名称调用它?
  • 我已添加空间并尝试在两种情况下将其作为 Hostname10 而不是 Hostaname10 执行,结果相同。错误报告 - ORA-06550:第 1 行,第 7 列:PLS-00201:标识符 'HOSTANAME10 ' 必须声明 ORA-06550:第 1 行,第 7 列:PL/SQL:语句被忽略 06550。00000 -“第 %s 行,第 %s 列:\n%s” *原因:通常是 PL/SQL 编译错误。 *行动:
  • @RahulJoshi - 错误仍然显示“HOSTANAME10”所以你没有改变你如何称呼它。如果您将电话添加到问题中可能会有所帮助;也许您在匿名块中有多个呼叫,而您只修复了一个。否则,您似乎并没有像您认为的那样运行。
  • :thanx for you response..是的,这是我的编码错误..我忘记添加一些空格
猜你喜欢
  • 2023-02-02
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多