Oracle删除分区truncate,利用Truncate清空Oracle各个分区的资料

本文介绍了一个在不授予强大权限如DBA角色的情况下,如何在Oracle中安全地清空特定用户拥有的表格分区的方法。通过创建并授权执行自定义存储过程trunc_tab,实现了用户仅凭DELETE权限即可清空表格数据的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*

In applications, users need truncate privileges on third party tables. The owner of the table can truncate his/her own tables. A user with DBA role granted can truncate a third party table. Any user with "drop any table" system privilege can truncate a third party table.

It is not recommended in Production environments to grant powerful roles like DBA role or privileges like "drop any table" privilege to accomplish this purpose.

This procedure need to be created in each schema. The schema owner need to grant execute permission to the user, and the delete permission on specified tables.

Then the user can execute the procedure to truncate tables User A owns the table temp_jp.

conn uwclass/uwclass

CREATE TABLE t1 AS

SELECT * FROM all_tables;

CREATE OR REPLACE PROCEDURE trunc_tab(p_tabname IN VARCHAR2) AUTHID DEFINER AS

/**********************************

AUTHOR JP Vijaykumar

ORACLE DBA

**********************************/

v_num    NUMBER(10):=0;

v_owner  VARCHAR2(30);

v_user   VARCHAR2(30);

sql_stmt VARCHAR2(2000);

BEGIN

SELECT username

INTO v_owner

FROM user_users;

SELECT sys_context('USERENV','SESSION_USER')

INTO v_user

FROM dual;

sql_stmt:='TRUNCATE TABLE ' || v_owner || '.' || p_tabname;

IF (v_owner = v_user) THEN

execute immediate sql_stmt;

ELSE

SELECT COUNT(*)

INTO v_num

FROM all_tab_privs

WHERE table_name = UPPER(p_tabname)

AND table_schema = v_owner

AND grantee = v_user

AND privilege in 'DELETE';

IF (v_num > 0) THEN

execute immediate sql_stmt;

ELSE

RAISE_APPLICATION_ERROR(-20001,'Insufficient privileges.');

END IF;

END IF;

EXCEPTION

WHEN OTHERS THEN

RAISE_APPLICATION_ERROR(-20001,'Insufficient privileges');

END trunc_tab;

/

GRANT execute ON t1 TO abc;

conn abc/abc

exec uwclass.trunc_tab('T1');

conn uwclass/uwclass

GRANT delete ON t1 TO abc;conn abc/abc

exec uwclass.trunc_tab('T1');

conn uwclass/uwclassSELECT * FROM t1;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值