日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在存储过程中调用execute immediate 执行 create table语句报TBR-17004: Permission denied

發(fā)布時間:2023/12/14 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在存储过程中调用execute immediate 执行 create table语句报TBR-17004: Permission denied 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

錯誤描述:

在存儲過程中調用execute?immediate?執(zhí)行?create?table語句報錯TBR-17004 權限不正確,但是直接執(zhí)行該語句不報錯.

SQL>?conn?sys/tibero
Connected?to?Tibero.

SQL>?create?user?dhr?identified?by?dhr;

User?'DHR'?created.

SQL>?grant connect,resource to?dhr;

Granted.

conn dhr/dhr

?

create?table?test?as?select?*?from?dual;

create?or?replace?procedure?p_create_tab
as
L_sql?VARCHAR2(32767)?;
BEGIN
FOR?i?IN?1?..?100
LOOP
l_sql?:='CREATE?TABLE?TEST_DHR_'?||I?||?'?AS?SELECT?*?FROM?TEST';
--?dbms_output.put?line(l_sql);
EXECUTE?IMMEDIATE?l_sql?;
end?loop;
end?;
/

SQL>?exec??p_create_tab;
TBR-17004:?Permission?denied.???
TBR-15163:?Unhandled?exception?at?DHR.P_CREATE_TAB,??line?9.???
TBR-15163:?Unhandled?exception?at??line?1.?



原因:

根據(jù)問題可以發(fā)現(xiàn)用戶確實有create?table的權限,查詢dba_role_privs?和?dba_sys_privs?發(fā)現(xiàn)用戶有?resource權限,但并無顯示的?create?table權限。在存儲過程中調用execute?immediate執(zhí)行sql語句,則用戶必須有顯示的賦權,而用戶的角色權限在這里不起作用。所以會報TBR-17004錯誤。

SQL>?select?*?from?dba_role_privs?where?grantee='DHR';
GRANTEE?? ?GRANTED_ROLE???????????ADMIN_OPTION?DEFAULT_ROLE
------------?------------------------------?------------?-----------
DHR ? ? ? ?CONNECT?????????????NO???????????YES
DHR ? ? ? ?RESOURCE????????????NO???????????YES

2?rows?selected.



SQL>?select?*?from?dba_sys_privs?WHERE?GRANTEE='RESOURCE';

GRANTEE???????PRIVILEGE?????????????ADMIN_OPTION
--------------------?----------------------------------------?------------
RESOURCE??????CREATE?TABLE????????????NO
RESOURCE??????CREATE?SEQUENCE???????????NO
RESOURCE??????CREATE?PROCEDURE? ?????????NO
RESOURCE??????CREATE?TRIGGER???????????NO

4?rows?selected.


解決方法:

1、可以顯示的賦給用戶?create?table權限
grant?create?table?to?DHR;

2、或可以在存儲過程上使用調用者權限。

create?or?replace?procedure?p_create_tab
AUTHID?CURRENT_USER?
as
L_sql?VARCHAR2(32767)?;
BEGIN
FOR?i?IN?1?..?100
LOOP
l_sql?:='CREATE?TABLE?TEST_DHR_'?||I?||?'?AS?SELECT?*?FROM?TEST';
--?dbms_output.put?line(l_sql);
EXECUTE?IMMEDIATE?l_sql?;
end?loop;
end?;
/



SQL>?EXEC?p_create_tab

PSM?completed.

?


總結

以上是生活随笔為你收集整理的在存储过程中调用execute immediate 执行 create table语句报TBR-17004: Permission denied的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。