Plsql 创建和删除表的PL/SQL过程

Plsql 创建和删除表的PL/SQL过程,plsql,Plsql,我运行了一个过程,使用PL/SQL删除并重新创建一个表,但它不起作用,并且表没有更新。。脚本如下: CREATE OR REPLACE procedure RUBA.pay_backup as r_create_table varchar(1000); Begin Begin r_create_table := 'Drop table payment_backup'; Execute Immediate r_create_table;

我运行了一个过程,使用PL/SQL删除并重新创建一个表,但它不起作用,并且表没有更新。。脚本如下:

CREATE OR REPLACE procedure RUBA.pay_backup
    as
       r_create_table varchar(1000);
Begin
    Begin
        r_create_table := 'Drop table payment_backup';
        Execute Immediate r_create_table;

        Exception
        When Others Then
           Null;
    End;

    r_create_table := 'Create Table payment_backup as Select * from payment_table';
    Execute Immediate r_create_table;

End;
/

这里的挑战是,在编译的PL/SQL过程的上下文中运行时,Oracle的安全模型通常需要直接授权,而不是通过角色授权

您可能会看到
ORA-01031:权限不足

您的用户可能已经通过角色授予了
CREATE TABLE
,但不是直接授予的。 检查如下:

-- List system privs granted via a role
select * from ROLE_SYS_PRIVS where ROLE in (select ROLE from USER_ROLE_PRIVS)
/
-- List system privs granted directly
select * from USER_SYS_PRIVS
/
有两种简单的方法可以使您的程序正常工作:

选项1

直接向您的用户授予
CREATE TABLE
。 以DBA身份连接并执行以下操作:

GRANT CREATE TABLE TO RUBA;
不幸的是,这是一个有点钝的工具,可能不是你想做的

选项2

使用调用方的权限创建您的过程:

CREATE OR REPLACE procedure RUBA.pay_backup AUTHID CURRENT_USER
    as
       r_create_table varchar(1000);
Begin
    Begin
        r_create_table := 'Drop table payment_backup';
        Execute Immediate r_create_table;

        Exception
        When Others Then
           Null;
    End;

    r_create_table := 'Create Table payment_backup as Select * from payment_table';
    Execute Immediate r_create_table;

End;
/
做一些实验,看看这个版本的情况如何。
请注意,如果您在作业中运行此功能,或作为其他用户连接时,可能会遇到问题。

这里的挑战是,您正在处理Oracle的安全模型,该模型通常需要直接授权,而不是在编译的PL/SQL过程的上下文中运行时通过角色授权

您可能会看到
ORA-01031:权限不足

您的用户可能已经通过角色授予了
CREATE TABLE
,但不是直接授予的。 检查如下:

-- List system privs granted via a role
select * from ROLE_SYS_PRIVS where ROLE in (select ROLE from USER_ROLE_PRIVS)
/
-- List system privs granted directly
select * from USER_SYS_PRIVS
/
有两种简单的方法可以使您的程序正常工作:

选项1

直接向您的用户授予
CREATE TABLE
。 以DBA身份连接并执行以下操作:

GRANT CREATE TABLE TO RUBA;
不幸的是,这是一个有点钝的工具,可能不是你想做的

选项2

使用调用方的权限创建您的过程:

CREATE OR REPLACE procedure RUBA.pay_backup AUTHID CURRENT_USER
    as
       r_create_table varchar(1000);
Begin
    Begin
        r_create_table := 'Drop table payment_backup';
        Execute Immediate r_create_table;

        Exception
        When Others Then
           Null;
    End;

    r_create_table := 'Create Table payment_backup as Select * from payment_table';
    Execute Immediate r_create_table;

End;
/
做一些实验,看看这个版本的情况如何。
请注意,如果您在作业中运行此功能,或者以其他用户身份连接,则可能会遇到问题。

对我来说很合适。你有什么错误吗?运行过程后是否尝试添加提交?请确保已创建
付款\u表。此外,在执行代码之前,您还应该创建
payment\u backup
表。你的代码运行得很好!什么不起作用?如果你有任何错误,发布相同的。对我来说很好。你有什么错误吗?运行过程后是否尝试添加提交?请确保已创建
付款\u表。此外,在执行代码之前,您还应该创建
payment\u backup
表。你的代码运行得很好!什么不起作用?如果您遇到任何错误,请发布相同的错误。您的异常例程将删除可能发生的任何错误,并隐藏问题。我认为这种结构是任何地方最糟糕的编程之一。事实上,Oracle曾经考虑过将其作为编译错误,没有考虑向后兼容性问题,但确实发出了编译警告。@Belayer,这是原始问题中的过程,修改只是为了显示调用方的权限。为什么不编辑此响应并进行修复--我完全同意您的看法,异常吞噬是个坏消息。您的异常例程正在删除可能发生的任何错误,从而隐藏问题。我认为这种结构是任何地方最糟糕的编程之一。事实上,Oracle曾经考虑过将其作为编译错误,没有考虑向后兼容性问题,但确实发出了编译警告。@Belayer,这是原始问题中的过程,修改只是为了显示调用方的权限。为什么不编辑此响应并进行修复--我完全同意您的看法,异常吞咽是个坏消息。