1. 程式人生 > >Oracle user1對user2使用者下所有表,有select、insert、delete、update許可權

Oracle user1對user2使用者下所有表,有select、insert、delete、update許可權

對於本地的使用者,執行INSERT操作只需要INSERT許可權,而只有INSERT許可權這對於通過資料庫鏈執行插入操作是不夠的。

Oracle管理員手冊是發現了這個問題,以前還確實沒有注意過。

看一個具體的例子,首先在本地建立一個普通使用者,並將表TINSERTUPDATEDELETE許可權授權給這個使用者:

SQL> show user 
USER is "TEST"
SQL> create table t (id number);

Table created.

SQL> create user u1 identified by u1;

User created.

SQL> grant create session to u1;

Grant succeeded.

SQL> grant insert, update, delete on t to u1;

Grant succeeded.

SQL> conn u1/u1
Connected.
SQL> insert into test.t values (1);

1 row created.

SQL> update test.t set id = 2;

1 row updated.

SQL> delete test.t;

1 row deleted.

SQL> commit;

Commit complete.

在本地執行,使用者U1可以對T表執行INSERTUPDATEDELETE的操作。

下面在遠端建立資料庫鏈,使用U1作為連線使用者:

SQL> select * from global_name;

GLOBAL_NAME
--------------------------------------------------------------------------------
TESTRAC

SQL> create database link test08
2 connect to u1
3 identified by u1
4 using '172.25.13.229/test08';

資料庫連結已建立。

SQL> select * from [email protected];

GLOBAL_NAME
--------------------------------------------------------------------------------
TEST08

SQL> insert into [email protected] values (1);
insert into [email protected] values (1)
*
 1 行出現錯誤:
ORA-01031: insufficient privileges
ORA-02063: 
緊接著 line (起自 TEST08)


SQL> update [email protected] set id = 1;
update [email protected] set id = 1
*
 1 行出現錯誤:
ORA-01031: insufficient privileges
ORA-02063: 
緊接著 line (起自 TEST08)


SQL> delete [email protected];
delete [email protected]
*
 1 行出現錯誤:
ORA-01031: insufficient privileges
ORA-02063: 
緊接著 line (起自 TEST08)

這是由於通過資料庫鏈訪問遠端物件的時候,Oracle需要查詢許可權來對錶結構進行分析,因此如果是通過資料庫鏈執行DML操作,除了對應的DML許可權外,使用者還需要SELECT許可權。

SQL> conn test/test
Connected.
SQL> grant select on t to u1;

Grant succeeded.

有了SELECT許可權,通過資料庫鏈執行DML就可以順利執行了:

SQL> insert into [email protected] values (1);

已建立 1 行。

SQL> update [email protected] set id = 2;

已更新 1 行。

SQL> delete [email protected];

已刪除 1 行。

SQL> commit;

提交完成。

SQL> select * from [email protected];

未選定行

---------------------------------------------------------------

其中我學習了,u1訪問test使用者中t表。

在我的資料庫中,user2已經存在很多表。

寫了一個儲存過程,把我資料庫user2所有表批量賦值給user1,

並且具有對錶的select、insert、delete、update許可權。

儲存過程如下:

CREATE OR REPLACE PROCEDURE GRANT_MAHANSO AS

CURSOR c_tablename IS

SELECT table_name FROM user_tables';

RetVal  NUMBER;

sCursor INT;

sqlstr  VARCHAR2(250);

BEGIN

  FOR v_tablename IN c_tablename

  LOOP

    sqlstr := 'GRANT SELECT,DELETE,UPDATE,INSERT ON user2.'|| v_tablename.table_name

    || ' TO user1';

    sCursor := dbms_sql.open_cursor;

    dbms_sql.parse(sCursor,sqlstr, dbms_sql.native);

    RetVal := dbms_sql.execute(sCursor); 

    dbms_sql.close_cursor(sCursor);

  END LOOP; 

END GRANT_MAHANSO ;

轉載請標明出處:http://space.itpub.net/12272958/viewspace-686912

相關推薦

Oracle user1user2使用者所有selectinsertdeleteupdate許可權

對於本地的使用者,執行INSERT操作只需要INSERT許可權,而只有INSERT許可權這對於通過資料庫鏈執行插入操作是不夠的。 看Oracle的管理員手冊是發現了這個問題,以前還確實沒有注意過。 看一個具體的例子,首先在本地建立一個普通使用者,並將表T的INSERT、UPDATE和DELETE許可權授

Oracle查看某個用戶所有的記錄總數和所有的字段總數記錄數

sele user details oracl sys where col 字段 rac https://blog.csdn.net/zhihaoma/article/details/78607368 如我想查看用戶M下的所有表的總記錄數: SELECT SUM(num_

Oracle 匯入資料庫 刪除使用者刪除空間刪除空間所有,檢視當前空間

匯入資料庫 在cmd下用 imp匯入  格式: imp userName/passWord file=bmp檔案路徑 ignore = y (忽略建立錯誤)full=y(匯入檔案中全部內容); 例: imp DISASTERV2/DISASTERV2 file=C:\Use

oracle—將指定使用者所有的查詢許可權賦給另一個使用者

一、建立新使用者user2。 二、在指定使用者(user1)下執行以下語句: select   'grant select on user1.' || t.table_name  || ' to user2;'  from user_tables t 輸出指令碼,複製指令碼

oracle空間使用情況查詢和用戶所有情況查詢

name 表空間 data user ace char sele 文件名 row 一、查看表空間使用情況 --查詢表空間使用情況   SELECT UPPER(F.TABLESPACE_NAME) "表空間名", D.FILE_N

Oracle查詢數據庫中所有的記錄數

ner dia function sta dbms repl log found tab 方法一: 首先建立一個計算函數 1 create or replace function count_rows(table_name in varchar2, 2

查詢一個用戶所有查詢表結構。設置列寬。

color logs 表名 pan for des .cn alt cnblogs SELECT * FROM TAB; DESC 表名 設置表列寬: COL 屬性名 FOR A長度; 查詢一個用戶下的所有表,查詢表結構。設置表列寬。

查詢資料庫中當前使用者所有儲存過程檢視觸發器

user_objects是oracle字典表的試圖,他包含了通過DDL建立的所有物件。表,試圖,索引。。等 all_table,  dba_table  , user_table   同理 Select object_name From user_obj

Oracle 和 AWS Redshift 獲取 資料庫所有名和列名的

Oracle select table_name from user_tables where table_name like '%plnsm%'; select OWNER, TABLE_NAME, COLUMN_NAME from all_tab_columns where COLU

mysql統計庫所有資料行數

一、執行下面sql select concat( 'select "', TABLE_name, '", count(*) from ', TABLE_SCHEMA, '.', TABLE_name, ' union all') from information_schema.tableswhere TAB

oracle 如何搜尋當前使用者所有表裡含某個值的欄位?

create or replace procedure MY_Pro_SearchKeyWord is  v_sql VARCHAR2(4000);  v_tb_column VARCHAR2(4000);  v_cnt NUMBER(18,0);  cursor cu

oracle(建立/刪除/修改使用者建立/刪除/修改空間授權使用者刪除所有給使用者指定空間

--oracle刪除某個使用者下的所有表 --此句只是查詢並且拼接sql,然後將執行的sql複製然後執行即可 select 'drop table '||table_name||';' from cat where table_type='TABLE'; export O

資料庫泵EXPDP匯出使用者所有

1. 在sys使用者下新建 SQL>create directory [dirname] as ‘[dirpath]’; dirname:取的名字 dirpath:dmp檔案匯出路徑

Windows資料夾所有圖片批量重新命名(附C++pythonmatlab程式碼)

原資料夾 重新命名之後 C++ #include <iostream> #include <io.h> //對系統檔案進行操作的標頭檔案 #include <string> #include

MYSQL 某個資料庫所有的 批量刪除語句

select concat('drop table ',table_name,';') from information_schema.TABLES where table_schema='test';

SQL Server清空庫所有資料

第一步:“新建查詢”-》建立儲存過程 如下: CREATE PROCEDURE sp_DeleteAllData AS EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL' EXEC sp_MSForEa

PHP -- 遍歷出目錄所有檔案及演算法優化

在想解決這個問題的時候,我也查找了很多資料。推薦給大家我個人覺得比較好的一篇:PHP遍歷檔案目錄 文中第四個演算法可以遍歷出文件夾下的所有檔案,程式碼如下: $dir = 'E:\phpStudy\PHPTutorial\WWW'; echo '<pre>'; functio

oracle procedure 將要賦值進行判斷否則會報異常

當你將查出來的值,into給一個定義的變數的時候,首先判斷是否查詢出來值。 create or replace procedure procedureName( parameterName in parameterType parameterName out paramet

利用boost遍歷路徑所有檔案並判斷檔案是否是資料夾

#include<boost/filesystem.hpp> void GetFileNameFromDir(const char* rootPath) {     boost::filesystem::path dir(rootPath);     if (b

java 遍歷指定包所有返回完整類名。工具類可以直接拷入使用

1、說明:       此類為本人開發的工具類,具體應用在什麼地方呢。本人在實際專案中,許可權管理這一塊有所應用,應該是許可權這一塊有所需求而開發的。 應用場景說明:許可權資源自動化生產時,使用者點選介面的一鍵生成資源時,介面中就會遍歷指定controller包下所有