背景:
由于
项
目要求,需要将数据从一个DB(DB1)
导
入到另一个DB(DB2)中。两个DB有相同的表
结
构,只是字段名字不一
样
:DB1中的字段是
汉
字的,而DB2中的字段是英文的。需要建立两个表之
间
的
连
接,再从DB1中
检
索数据插入到DB2中。因此,
问题
的
关键
在于在DB1中建立同DB2的
连
接(也可以在DB2中建立同DB1的
连
接)。O
racle
提供了
DataBase Link
来
连
接两个DB,从而方便的
实现
跨DB的操作。
技术
点摘要:
从本
质
上来
说
DBLink
也是Oracle数据
库
中的一个
对
象。我
们
可以想
创
建其它Oracle
对
象一
样创
建和
删
除DBLink。只是有两点需要注意:一是
权
限
问题
,登
陆
的用
户
必
须
要有
创
建DBLink的
权
限。二是
创
建的DBLink的
访问权
限,如果
创
建了一个非管理
员
用
户
只能
创
建具有公有(public)
访问权
限的DBLink。
实现细节:
用户有了权限后就可以创建DBLink
了:
首先要确保你的DB能正确的
连
接。
连
接一个DB有两个
办
法:1是在本地安装Oracle的客
户
端,在TNSNAMES.ora
中配置
对远
程机器的
连
接。2是直接
连
接
远
程的数据
库
服
务
器。如:假
设
在IP
为
172.16.97.131
的机器上有一个DB服
务
器,服
务
名
为
OraServer
,那也可以
这样
指定
连
接:172.16.97.131/OraServer。而不用在本地配置TNS。不管采用哪
种
方式必
须
保
证
你的机器能正常
连
接到DB1和DB2。
然后就是确保连接的用户要有创建
DBLink
的权限。如果你需要用
DB1
连接
DB2
,那你登陆
DB1
的用户必须要有创建
DBLink
的权限。可以用
SYSDBA
的身份登陆
DB
执行下面的语句为指定用户授权:
grant
create
public
database
link
to
username
CREATE PUBLIC DATABASE
LINK LKNAME
CONNECT TO USERNAME
IDENTIFIED BY PASSWORD
USING ‘DBSERVER’
CONNECT TO USERNAME
IDENTIFIED BY PASSWORD
USING ‘DBSERVER’
建立连接后可以用语句查看创建的DBLink下面的 使用完了以后要删除已创建的DBLink:
select
db_link
from
dba_db_links;
DROP
PUBLIC
DATABASE
LINK LKNAME
需要说明的是,如果你创建的不是PUBLIC的DBLINK,那只能有创建者删除自己创建的DBLINK,而非管理员权限的用户创建的DBLink只能由SYS用户删除
/**/
/// <summary>
/// DBリック作成
/// </summary>
/// <returns>エラーがある場合、エラーメッセージを戻す</returns>
private string CreateDBLink()
... {
try
...{
//DB接続処理
if (cnnDestDB.State != ConnectionState.Open)
...{
cnnDestDB.Open();
}
OracleCommand cmdCreateLink = new OracleCommand();
cmdCreateLink.Connection = cnnDestDB;
//DBリックSQL文
//CREATE PUBLIC DATABASE LINK LINKNAME CONNECT TO USERNAME IDENTIFIED BY PASSWORD USING 'SID'
string strCreateLink = "CREATE PUBLIC DATABASE LINK " + strLinkName + " CONNECT TO " + txtUserId2.Text.Trim() + " IDENTIFIED BY " + txtPassWord2.Text + " USING '" + txtSid2.Text.Trim() + "'";
cmdCreateLink.CommandText = strCreateLink;
//DBリック作成
cmdCreateLink.ExecuteNonQuery();
cnnDestDB.Close();
return string.Empty;
}
catch (Exception ex)
...{
if (cnnDestDB.State != ConnectionState.Closed)
...{
cnnDestDB.Close();
}
return ex.Message;
}
}
/**/ /// <summary>
/// DBリックの削除
/// </summary>
/// <returns>エラーがある場合、エラーメッセージを戻す</returns>
private string DeleteDBLink()
... {
try
...{
//DB接続処理
if (cnnDestDB.State != ConnectionState.Open)
...{
cnnDestDB.Open();
}
OracleCommand cmdDropLink = new OracleCommand();
cmdDropLink.Connection = cnnDestDB;
//DBリックSQL文
//DROP PUBLIC DATABASE LINK LINKNAME
string strDropLink = "DROP PUBLIC DATABASE LINK " + strLinkName;
cmdDropLink.CommandText = strDropLink;
//DBリック削除
cmdDropLink.ExecuteNonQuery();
cnnDestDB.Close();
return string.Empty;
}
catch (Exception ex)
...{
if (cnnDestDB.State != ConnectionState.Closed)
...{
cnnDestDB.Close();
}
return ex.Message;
}
}
/// DBリック作成
/// </summary>
/// <returns>エラーがある場合、エラーメッセージを戻す</returns>
private string CreateDBLink()
... {
try
...{
//DB接続処理
if (cnnDestDB.State != ConnectionState.Open)
...{
cnnDestDB.Open();
}
OracleCommand cmdCreateLink = new OracleCommand();
cmdCreateLink.Connection = cnnDestDB;
//DBリックSQL文
//CREATE PUBLIC DATABASE LINK LINKNAME CONNECT TO USERNAME IDENTIFIED BY PASSWORD USING 'SID'
string strCreateLink = "CREATE PUBLIC DATABASE LINK " + strLinkName + " CONNECT TO " + txtUserId2.Text.Trim() + " IDENTIFIED BY " + txtPassWord2.Text + " USING '" + txtSid2.Text.Trim() + "'";
cmdCreateLink.CommandText = strCreateLink;
//DBリック作成
cmdCreateLink.ExecuteNonQuery();
cnnDestDB.Close();
return string.Empty;
}
catch (Exception ex)
...{
if (cnnDestDB.State != ConnectionState.Closed)
...{
cnnDestDB.Close();
}
return ex.Message;
}
}
/**/ /// <summary>
/// DBリックの削除
/// </summary>
/// <returns>エラーがある場合、エラーメッセージを戻す</returns>
private string DeleteDBLink()
... {
try
...{
//DB接続処理
if (cnnDestDB.State != ConnectionState.Open)
...{
cnnDestDB.Open();
}
OracleCommand cmdDropLink = new OracleCommand();
cmdDropLink.Connection = cnnDestDB;
//DBリックSQL文
//DROP PUBLIC DATABASE LINK LINKNAME
string strDropLink = "DROP PUBLIC DATABASE LINK " + strLinkName;
cmdDropLink.CommandText = strDropLink;
//DBリック削除
cmdDropLink.ExecuteNonQuery();
cnnDestDB.Close();
return string.Empty;
}
catch (Exception ex)
...{
if (cnnDestDB.State != ConnectionState.Closed)
...{
cnnDestDB.Close();
}
return ex.Message;
}
}