1. 程式人生 > >解決ORA-02021: 不允許對遠端資料庫進行 DDL 操作下面通過DBLINK呼叫遠端過程來執行這樣的操作。

解決ORA-02021: 不允許對遠端資料庫進行 DDL 操作下面通過DBLINK呼叫遠端過程來執行這樣的操作。

一般情況下,當我們直接truncate一個遠端的表的時候,通常會返回如下的錯誤資訊:
ORA-02021: DDL operations are not allowed on a
remote database.


比如下面的示例:

先在資料庫test上建立一個test表,並插入一些資料,如下:
SQL> conn toms/toms
已連線。

SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
test
SQL> create table test(no int);

表汛脣ā?

SQL> insert into test values(100);

已建立 1 行。

SQL> commit;
提交完成


然後在另外一個數據庫(study
)上建一個 dblink,並嘗試去truncate test資料庫上
toms使用者下的test表:
SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
study
SQL> create database link from_test connect to toms 
identified by toms using 'local_test';

資料庫連結已建立。

SQL> select * from [email protected]_test;

未選定行

SQL> truncate table 
[email protected]
_test; truncate table [email protected]_test * ERROR 位於第 1 行: ORA-02021: 不允許對遠端資料庫進行 DDL 操作 SQL> 這時,我們得到了ORA-02021這樣的錯誤,Oracle不允許這麼做。那麼如果確實有這樣的需求, 我們該怎麼辦呢。下面我介紹一個方法: 先在test資料庫上,建立一個類似如下的procedure: SQL> create or replace procedure proc_truncate_remote_tab
(p_tname in varchar2) as 2 BEGIN 3 EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || p_tname; 4 EXCEPTION 5 WHEN OTHERS THEN 6 raise_application_error(-20001,SQLERRM); 7 end; 8 / 過程已建立。 然後在study資料庫上呼叫test資料庫上的這個procedure去完成這個truncate動作: BEGIN [email protected]_link('remote_table_name'); END; 下面測試驗證一下: SQL> select instance_name from v$instance; INSTANCE_NAME ---------------- study SQL> SQL> select *from [email protected]_test; NO ---------- 100 SQL> begin 2 [email protected]_test('test'); 3 end; 4 / PL/SQL 過程已成功完成。 SQL> select *from [email protected]_test; 未選定行 SQL>

可以看到,遠端test資料庫上toms使用者下的表test已經被truncate掉了。

註釋:

在遠端的庫建立一個儲存過程,這個儲存過程宣告為自治事務,它接受一個引數,可以是你要建立的表名。
過程裡面採用動態SQL建表。
然後你就可以遠端呼叫這個過程。

但不知道這樣做有什麼實用意義。

上述用在遠端的庫建立一個儲存過程的方法,不能解決“將訪問本地資料庫上一個方案裡的表的許可權授權給遠端資料庫上的一個使用者”(即如 grant select on tab to [email protected](或是global name) )的問題.

相關推薦

解決ORA-02021: 允許遠端資料庫進行 DDL 操作下面通過DBLINK呼叫遠端過程執行這樣操作

一般情況下,當我們直接truncate一個遠端的表的時候,通常會返回如下的錯誤資訊:ORA-02021: DDL operations are not allowed on a remote database. 比如下面的示例: 先在資料庫test上建立一個test表,並插入一些資料,如下: SQL>

解決系統管理員允許使用儲存的憑據登入遠端計算機

一臺加入到 ActiveDirectory(活動目錄 – AD,注:WinSRV2008)的 Windows 7 客戶端,使用 Remote Desktop 登入 AD 內部的計算機時能夠使用已儲存的憑據進行自動驗證。但是 AD 外部的計算機即使儲存了登入憑據,在連線時仍然會提示輸入密碼,如下圖所示: R

oracle通過DBLink訪問遠端資料庫的LOB欄位報ORA-22992的解決方法

oracle通過DBLink訪問遠端資料庫的LOB欄位報ORA-22992的解決方法 最近在做資料庫遷移,從一個數據庫匯入表到另外一個數據庫,同時為了更換表空間,在匯入的過程中出現包含BLOB型別的表不能匯入,(欄位是BLOB型別),如果本地資料庫直接通過select語

MSSQL資料庫提示:支援系統目錄進行即席更新

不支援對系統目錄進行即席更新--如果"allow updates"選項被設定為"1",那麼你在使用語句: EXEC sp_configure 'show advanced options', 1 ;GORECONFIGURE ;  --沒有加上WITH OVERRIDE,就會出現提示的錯誤GO --所以,

linux下啟用定時任務mysql資料庫進行定時備份

                                          &

DJANGO專案用WEB的方式MYSQL資料庫進行備份匯出等管理任務的實現

環境:PYTHON2.7,DJANGO1.9.9 urls.py 加一行: url(r'^mysqldatamanage/', views.mysqldatamanage,name='mysqldatamanage'),   views.py新增對應的方mysqldatam

Spring Boot 2.x使用Spring Data JpaMySQL資料庫進行CRUD操作

 只需兩步!Eclipse+Maven快速構建第一個Spring Boot專案 構建了第一個Spring Boot專案。 Spring Boot連線MySQL資料庫 連線了MySQL資料庫。 本文在之前的基礎上,使用Spring Data Jpa對MySQL

C++MySQL資料庫進行匯出和匯入操作

相信大家應該在網上看到很多利用SQL語句對MySQL資料庫的表或者資料庫本身進行匯出和匯入操作。在window環境下利用dos命令列匯出資料庫(我的mysq直接裝在c盤根目錄下下,其bin目錄為:c:/mysql/bin): 1、執行MySQL資料庫匯出操作: c:\my

MyCat:MySQL資料庫進行分庫分表

本篇前提: mycat配置正確,且能正常啟動。 1、schema.xml <table>標籤: dataNode -- 分片節點指定(取值:dataNode中的name屬性值) rule ------ 分片規則選擇(取值:rule標籤中的

用JavaScriptMySQL資料庫進行操作的方法

Javascript訪問Access很容易實現,但JS訪問MYSQL卻沒有找到很簡單的方法。今天在瀏覽MYSQL網站時,發現MYSQL有ODBC連線,突然想到JS是可以通過ActiveX訪問ODBC資料庫的,經過測試發現JS連線MYSQL如此簡單!1、下載MYSQL的ODB

JavaMySQL資料庫進行操作【java】

資料庫幾乎是每一個應用型的程式都會用到,學會如何高效操作資料庫也是開發一個重點。今天我總結了具體的操作步驟以及注意點。Java訪問資料庫主要用的方法是JDBC,它是java語言中用來規範客戶端程式如何來訪問資料庫的應用程式介面,提供了諸如查詢和更新資料庫中資料的方法,接下來

nodejs 利用mysql資料庫進行查詢和插入資料

nodejs對資料庫的操作是比較簡單的。下面看一個對laughter庫操作: 這是專案檔案結構圖: config.js的配置如下: //資料庫配置檔案 module.exports = { mysql: {

使用JDBCMySQL資料庫進行增、刪、改、查 7.03

JDBC(Java Data Base Connectivity,java資料庫連線)是一種用於執行SQL語句的Java API,可以為多種關係資料庫提供統一訪問,它由一組用 Java語言編寫的類和

JAVAMYSQL資料庫進行批量操作,addBatch(),executeBatch()方法

有人說MySql的JDBC驅動,不是真正支援批量操作的,就算你在程式碼中呼叫了批量操作的方法,MySql的JDBC驅動也是按照一般操作來處理的。 但其實並非如此,Mysql 是有特殊的方式優化整個batch insert 結果的。 可不可以先假設 batch 的方式與非

Hibernate框架mysql資料庫進行CRUD(增改改刪)

使用hibernate框架對mysql資料庫進行增刪改查 1、建立一個java工程,並且建立一個數據庫hibernate 2、建立一個lib資料夾,拷貝jar包,並且build path(圈起的三個是測試jar包,編輯器有的話可以不考)

如何用JMeterMySQL資料庫進行壓測?

在Jmeter中建立一個JDBC Request 測試計劃主要分兩步。 (1)設定JDBC連線池(在JDBC Connection Configuration) (2)新增JDBC Request 其他步驟就是設定引數化、斷言、監聽結果。 第一步:新增 JDBC Conne

Java專案中MongoDB資料庫進行檔案上傳

import com.mongodb.MongoClient; import com.mongodb.client.MongoDatabase; import com.mongodb.client.gridfs.GridFSBucket; import com.mongodb.client.gridfs.G

Oracle資料庫通過DBLINK實現遠端訪問

什麼是DBLINK?dblink(Database Link)資料庫連結顧名思義就是資料庫的連結  ,就像電話線一樣,是一個通道,當我們要跨本地資料庫,訪問另外一個數據庫表中的資料時,本地資料庫中就必須要建立遠端資料庫的dblink,通過dblink本地資料庫可以像訪問本地資

JDBC javaMySQL資料庫進行查詢操作,並把查詢的結果輸出

Resultset中的所有資料都可以通過getString()方法取得 String是可以接收表中的任意型別列的內容,所以在以下的程式中全部都使用getString()接收 package JDBC;

scalikejdbc框架mysql資料庫進行增刪改查,事務建立

1.在scala中想要操作mysql數庫中的資料,可以使用scalikejdbc。 2.匯入依賴。 3.在resource檔案中新增application.conf檔案。然後配置引數。 db.def