Plsql 创建和删除表的PL/SQL过程
我运行了一个过程,使用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;
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,这是原始问题中的过程,修改只是为了显示调用方的权限。为什么不编辑此响应并进行修复--我完全同意您的看法,异常吞咽是个坏消息。