首页 > phper

Sql Server下数据库链接的使用方法

有时候我们希望在一个sqlserver下访问另一个sqlserver数据库上的数据,或者访问其他oracle数据库上的数据,要想完成这些操作,我们首要的是创建数据库链接。
  数据库链接能够让本地的一个sqlserver登录用户映射到远程的一个数据库服务器上,并且像操作本地数据库一样。那么怎么创建数据库链接呢?我现在有两种方法可以实现。
  第一种:在 sqlserver 企业管理器中,建立,这个比较简单的,首先在 安全性--〉数据库链接 上点右键 ,在出现的菜单中点 新建数据库链接 ,然后会弹出一个界面,需要我们填写的有:链接服务器(这是一个名字,自己根据情况自行定义,以后就要通过他进行远程访问了),提供程序名称(这个就是选择数据驱动,根据数据库类型来选择,不能乱选,否则链接不上的),数据源(对于sqlserver就是远程数据库服务器的主机名或者IP,对于 oracle 就是在 oracle net config 中配置的别名),安全上下文用户和口令(也就是远程服务器的用户和口令)。
  第二种:利用系统存储过程
  创建一个sqlserver对sqlserver的数据库链接:
exec sp_addlinkedserver 'link_northsnow','','SQLOLEDB','远程服务器主机名或域名或ip地址'
exec sp_addlinkedsrvlogin 'link_northsnow','false',null,'用户名','用户口令'
  创建一个sqlserver对Oracle的数据库链接:
exec sp_addlinkedserver 'link_ora', 'Oracle', 'MSDAORA', 'oracle数据库服务器别名'
exec sp_addlinkedsrvlogin 'link_ora', false, 'sa', '用户名', '用户口令'
  有了数据库链接我们就可以使用了。对于sqlserver和oracle中的使用方法是有区别的。
  对于sqlserver:
create view v_lhsy_user as select * from link_northsnow.lhsy.dbo.sys_user
select * from v_lhsy_user
其中lhsy为远程的数据库名
sys_user为表名
  对于 oracle:
create view vvv as select * from link_ora..NORTHSNOW.SYS_USER
select * from vvv;
其中northsnow为远程oracle数据库服务器的一个用户名,SYS_USER为该用户在该服务器上的一个表,要非常注意的是:数据库链接(link_ora)后面有两个点(..),再往后面必须全部大写,查询的对象一般为表格或者视图,不能查询同义词。
  要想删除数据库链接,也有两种方法,
  一种是在企业管理器中操作,这个简单。
  另一种是用系统存储过程:
  exec sp_dropserver 数据库链接名称,'droplogins'
  终于写完了,感兴趣的请留言 或 email me:northsnow@163.com

阅读全文

Sql联合查询

联合查询
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联合查询。UNION的语法格式为:
select_statement
UNION [ALL] selectstatement
[UNION [ALL] selectstatement][…n]
其中selectstatement为待联合的SELECT查询语句。
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一行。
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类型,系统将低精度的数据类型转换为高精度的数据类型。
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如:
查询1 UNION (查询2 UNION 查询3)
原作者:不详
来源:MSSQL设计实务

阅读全文

怎样才能限制SQLServer只能让指定的机器连接(转)

Q. How can I restrict access to my SQL Server so that it only allows certain machines to connect?
(v1.0 19.10.1998)
怎样才能限制我的SQL Server只能让指定的机器连接
A. SQL Server has no built-in tools/facilities to do this. It also does not have the facility to run a stored-procedure on connection that could be written/used to do this. Therefore you have the following choices :-
     SQL Server没有这样的功能,也没有提供在连接时执行某一特定过程的功能。这里介绍几种实现的方法
1. Put the SQL Server behind a firewall and use that to restrict access. This is the most secure and functional way to do what you want.
    使用防火墙,它提供了安全和你想用的工具。
2. Write your own ODS Gateway and point the clients at that instead of the SQL Server - the ODS Gateway will then do the checking. However, there is nothing stopping clients figuring out the correct SQL client-config entries to point straight at the SQL Server. There are examples of ODS code in the SQL Programmers Toolkit - available for free download from the MS website.
    写自己的ODS网关代替SQL Server的客户端 - 在ODS网关中检查。不过,这并不能停止正常的客户端连接SQL Server。在SQL Programmers Toolkit中有一个这样的例, 可以从微软站点免费下载。
3. Write a constantly running/scheduled stored-procedure that checks the relevant column in sysprocesses (net_address), and then issues a KILL command for any processes that should not be running. Note that this only works for MAC addresses. This way allows people to connect and possibly make changes before they are spotted and killed.
    写一个存储过程检查sysprocesses中的相应列(net_address)
 

阅读全文

在Linux防火墙上编译Apache+PHP4+Mysql(转)

目的: 一台Redhat linux 6.2 用为防火墙,专线连结Chinanet,对内连结
    局域网段192.168.11.0/24,需要enable PHP4和Mysql数据库,且局域网
        上有另一台Apache服务器192.168.11.2,需要对外部用户提供服务,利用
        防火墙上编译的Apache反向代理和名字虚拟主机的功能来实现
地址: 防火墙外部地址为a.b.c.210,且别名第二个地址为a.b.c.211,内部网卡
        地址为192.168.11.5,内部LAN上的Apache服务器为192.168.11.2
实现:
1.下载三个源文件到防火墙机器的/tmp下
apache_1.3.12.tar.gz
mysql-3.22.32.tar.gz    
php-4.0.1pl2.tar.gz
2. 在/tmp下分别解开三个文件
# tar xvfz apache*gz
# tar xvfz mysql*gz
# tar xvfz php*gz
3. 进入/tmp/mysql*,编译mysql
#./configure --prefix=/usr/local/mysql
#make
#make install
#scripts/mysql_install_db
#/usr/local/mysql/bin/safe_mysqld &
#/usr/local/mysql/bin/mysqladm -u root password newpassword
4. 进入/tmp/php*,编译PHP4
#./configure --with-mysql --with-apache=../apche_1.3.12
        --enable-track-vars
#make;make install
5. 下载反向代理X-forward-for模块,地址是
http://perl.apache.org/guide/download.html#mod_proxy_add_forward
下载后放该文件mod_proxy_add_forward.c到/tmp/apache_1.3.12/src/modules/
extra/目录下
5.编译Apache,加入PHP4模块 和大多数共享模块库
./configure --prefix=/usr/local/apache
--activate-module=src/modules/php4/libphp4.a
--activate-module=src/modules/extra/mod_proxy_add_forward.c
--enable-module=most --enable-shared=max
6. 拷贝php.ini-dist到其它目录
# cd /tmp/php*
# cp php.ini-dist /usr/local/lib/php.ini
7.编辑/usr/local/apache/conf/httpd.conf中的AddType行
AddType application/x-httpd-php4 .php
8. 编辑/usr/local/apache/conf/httpd.conf中的AddModule行,

阅读全文

mysql让存储结果分页,用于复杂查询

mysql让存储结果分页,用于复杂查询。

似乎讨论分页的人很少,难道大家都沉迷于limit m,n?
在有索引的情况下,limit m,n速度足够,可是在复杂条件搜索时,
where somthing order by somefield+somefield
mysql会搜遍数据库,找出“所有”符合条件的记录,然后取出m,n条记录。
如果你的数据量有几十万条,用户又搜索一些很通俗的词,
然后要依次读最后几页重温旧梦。。。mysql该很悲壮的不停操作硬盘。

所以,可以试着让mysql也存储分页,当然要程序配合。
(这里只是提出一个设想,欢迎大家一起讨论)

ASP的分页:在ASP系统中有Recordset对象来实现分页,但是大量数据放在内存中,而且不知道什么时候才失效(请ASP高手指点).
SQL数据库分页:用存储过程+游标方式分页,具体实现原理不是很清楚,设想如果用一次查询就得到需要的结果,或者是id集,需要后续页时只要按照结果中的IDs读出相关记录。这样只要很小的空间保留本次查询的所有IDs. (SQL中的查询结果不知道怎样清楚过期垃圾?)

这样,可以让mysql模拟存储分页机制:
1. select id from $table where $condition order by $field limit $max_pages*$count;
     查询符合条件的IDs.
     限定最大符合条件的记录数量,也可以不加。
2. 因为php在执行结束后所有变量都要lost,所以可以考虑:
     方案a. 在mysql建立临时表,查询结果用一个时间或随机数作为唯一标志插入。
      其中建立page1~pagen个字段,每个字段保存该页中需要的ids, 这样一个id对一条记录.
     方案b. 如果打开session,也可以放在session中保存,实际上是放在文件中保存。
         建立一个$IDs数组,$IDs[1]~$IDs[$max_pages]. 考虑到有时候用户会开几个
         窗口同时查询,要为$ids做一个唯一标志,避免查询结果相互覆盖。二维数组
         和$$var都是好办法。
3. 在每页页的请求中,直接找到对应的IDs,中间以","间隔:
      select * from $table where id in ($ids); 速度绝对快

阅读全文

简单三步走堵死SQLServer注入漏洞

SQL注入是什么?
许多网站程序在编写时,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码(一般是在浏览器地址栏进行,通过正常的www端口访问),根据程序返回的结果,获得某些想得知的数据,这就是所谓的SQL Injection,即SQL注入。 
SQL注入通过网页对网站数据库进行修改。它能够直接在数据库中添加具有管理员权限的用户,从而最终获得系统管理员权限。黑客可以利用获得的管理员权限任意获得网站上的文件或者在网页上加挂木马和各种恶意程序,对网站和访问该网站的网友都带来巨大危害。
  防御SQL注入有妙法
  第一步:很多新手从网上下载SQL通用防注入系统的程序,在需要防范注入的页面头部用来防止别人进行手动注入测试。
  可是如果通过SQL注入分析器就可轻松跳过防注入系统并自动分析其注入点。然后只需要几分钟,你的管理员账号及密码就会被分析出来。
  第二步:对于注入分析器的防范,笔者通过实验,发现了一种简单有效的防范方法。首先我们要知道SQL注入分析器是如何工作的。在操作过程中,发现软件并不是冲着“admin”管理员账号去的,而是冲着权限(如flag=1)去的。这样一来,无论你的管理员账号怎么变都无法逃过检测。
  第三步:既然无法逃过检测,那我们就做两个账号,一个是普通的管理员账号,一个是防止注入的账号,为什么这么说呢?笔者想,如果找一个权限最大的账号制造假象,吸引软件的检测,而这个账号里的内容是大于千字以上的中文字符,就会迫使软件对这个账号进行分析的时候进入全负荷状态甚至资源耗尽而死机。下面我们就来修改数据库吧。
  1.对表结构进行修改。将管理员的账号字段的数据类型进行修改,文本型改成最大字段255(其实也够了,如果还想做得再大点,可以选择备注型),密码的字段也进行相同设置。
  2.对表进行修改。设置管理员权限的账号放在ID1,并输入大量中文字符(最好大于100个字)。
  3.把真正的管理员密码放在ID2后的任何一个位置(如放在ID549上)。
  我们通过上面的三步完成了对数据库的修改。
  这时是不是修改结束了呢?其实不然,要明白你做的ID1账号其实也是真正有权限的账号,现在计算机处理速度那么快,要是遇上个一定要将它算出来的软件,这也是不安全的。我想这时大多数人已经想到了办法,对,只要在管理员登录的页面文件中写入字符限制就行了!就算对方使用这个有上千字符的账号密码也会被挡住的,而真正的密码则可以不受限制。
 

阅读全文

在SQL Server 2005中编辑SQL Server 2000 DTS

今天为了体验一下SQL Server 2005的新功能,狠下心把本机的SQL Server 2000 干掉了,安装了一个SQL Server 2005,体验了一下很多很多的新功能,这时突然想起还有一些DTS改良工作还未完成,于是用SQL Server Management Studio 链接到SQL Server 2000服务器上,打开DTS包,正想编辑的时候,出现了错误误提示:编辑DTS包需要SQL Server 2000 DTS 设计器组件。要使用此功能,请安装特殊的WEB下载文件“SQL Server 2000 DTS 设计器组件". 也就是说SQL Server 2005 的 SQL Server Management Studio 默认是不能编辑DTS 2000(SQL Server 2000的DTS)的。为了解决这个问题,Microsoft增加了一个补丁提供给用户下载。装上这个补丁后就可以像SQL Server 2000一样编辑DTS包了。
SQL 2000 DTS tools are now available as part of the -
Download details: Feature Pack for SQL Server 2005 Nov 2005
(

阅读全文

SQL语言快速入门之二

创建表格
SQL语言中的create table语句被用来建立新的数据库表格。Create table语句的使用格式如下:
create table tablename
(column1 data type,
column2 data type,
column3 data type);
如果用户希望在建立新表格时规定列的限制条件,可以使用可选的条件选项:
create table tablename
(column1 data type [constraint],
column2 data type [constraint],
column3 data type [constraint]);
举例如下:
create table employee
(firstname varchar(15),
lastname varchar(20),
age number(3),
address varchar(30),
city varchar(20));
简单来说,创建新表格时,在关键词create table后面加入所要建立的表格的名称,然后在括号内顺次设定各列的名称,数据类型,以及可选的限制条件等。注意,所有的SQL语句在结尾处都要使用“;”符号。
使用SQL语句创建的数据库表格和表格中列的名称必须以字母开头,后面可以使用字母,数字或下划线,名称的长度不能超过30个字符。注意,用户在选择表格名称时不要使用SQL语言中的保留关键词,如select, create, insert等,作为表格或列的名称。
数据类型用来设定某一个具体列中数据的类型。例如,在姓名列中只能采用varchar或char的数据类型,而不能使用number的数据类型。
SQL语言中较为常用的数据类型为:
char(size):固定长度字符串,其中括号中的size用来设定字符串的最大长度。Char类型的最大长度为255字节。
varchar(size):可变长度字符串,最大长度由size设定。
number(size):数字类型,其中数字的最大位数由size设定。
Date:日期类型。
number(size,d):数字类型,size决定该数字总的最大位数,而d则用于设定该数字在小数点后的位数。
最后,在创建新表格时需要注意的一点就是表格中列的限制条件。所谓限制条件就是当向特定列输入数据时所必须遵守的规则。例如,unique这一限制条件要求某一列中不能存在两个值相同的记录,所有记录的值都必须是唯一的。除unique之外,较为常用的列的限制条件还包括not null和primary key等。Not null用来规定表格中某一列的值不能为空。Primary key则为表格中的所有记录规定了唯一的标识符。
向表格中插入数据
SQL语言使用insert语句向数据库表格中插入或添加新的数据行。Insert语句的使用格式如下:
insert into tablename

阅读全文

以前编写Like谓词被忽略的使用方法

我们知道在使用SQL语句编写查询时会用到SELECT语句。它的基本结构如下:
SELECT ... ... FROM ... ... WHERE ... ... ORDER BY ... ...
在使用WHERE条件子句时我们知道可以通过LIKE关键字进行模糊查询,而且我们也知道可以使用通配符实现这个。我们通常知道的通配符有下划线_和百分号%。其实我们还有其它的查询匹配可用,只是我们不经常使用而忽略了它们。被我们忽略的就是匹配特定范围[]和匹配特定范围之外的[^]两个。
下面大家先看看在Microsoft SQL Server中定义的通配符:
通配符 说明

_(下划线) 与任意单字符匹配

% 与包含一个或多个字符的字符串匹配

[ ] 与特定范围(例如,[a-f])或特定集(例如,[abcdef])中的任意单字符匹配。

[^] 与特定范围(例如,[^a-f])或特定集(例如,[^abcdef])之外的任意单字符匹配。

下面我们列出一些事例去说明这些通配符的使用。

WHERE FirstName LIKE '_im' 可以找到所有三个字母的、以 im 结尾的名字(例如,Jim、Tim)。
 


WHERE LastName LIKE '%stein' 可以找到姓以 stein 结尾的所有员工。
 


WHERE LastName LIKE '%stein%' 可以找到姓中任意位置包括 stein 的所有员工。
 


WHERE FirstName LIKE '[JT]im' 可以找到三个字母的、以 im 结尾并以 J 或 T 开始的名字(即仅有 Jim 和 Tim)


WHERE LastName LIKE 'm[^c]%' 可以找到以 m 开始的、后面的(第二个)字母不为 c 的所有姓。
 

阅读全文

三步堵死SQL注入漏洞

SQL注入是什么?
  许多网站程序在编写时,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码(一般是在浏览器地址栏进行,通过正常的www端口访问),根据程序返回的结果,获得某些想得知的数据,这就是所谓的SQL Injection,即SQL注入。
网站的恶梦——SQL注入
  SQL注入通过网页对网站数据库进行修改。它能够直接在数据库中添加具有管理员权限的用户,从而最终获得系统管理员权限。黑客可以利用获得的管理员权限任意获得网站上的文件或者在网页上加挂木马和各种恶意程序,对网站和访问该网站的网友都带来巨大危害。
防御SQL注入有妙法
  第一步:很多新手从网上下载SQL通用防注入系统的程序,在需要防范注入的页面头部用 来防止别人进行手动注入测试(如图1)。

阅读全文

如何将Access和Excel导入到Mysql中之三

二。导库的VB程序
  这个工程要使用一些对象库,在数据库访问方面,决定使用ADO(ActiveX Data Objects),对于使用过ASP的人,这个名字应该非常熟悉了,实际上,它在VB中的应用也是几乎一样的,由于要操作Excel,还要引用一个扩展的对象库。点菜单中的“工程”---“引用”,选择“Microsoft ActiveX Data Objects 2.6 Library”和“Microsoft Excel 9.0 Object Library”,在引用列表中,可引用对象库的版本或许有所不同,选择类似的最新版本就可以了。要使用对话框和进度条,还要引用一些部件,点菜单中的“工程”--“部件”,选择“Microsoft Common Dialog Control 6.0(SP3)”和“Microsoft Windows Common Controls 6.0(SP3)”。
 
界面如图一所示
图中各数字表示的控件分别是:
1-3:3个均为TextBox控件,名字分别为mdbfilename,mdbpassword,xlsfilename,mdbfilename用来指示导入Access文件的路径和文件名,mdbpassword用来输入Access文件的密码,xlsfilename用来指示导入Excel文件的路径和文件名;
4:名称为select_mdbfile,CommandButton控件,用来选择要导入的Access文件;
5:名称为importMDB,CommandButton控件,选择好文件后,用该按钮导入MDB文件
6:名称为CommonDialog1,CommonDialog控件
7:名称为select_xlsfile,CommandButton控件,用来选择要导入的Excel文件;
8:名称为importXLS,CommandButton控件,选择好文件后,用该按钮导入XLS文件;
9:名称为CommonDialog2,CommonDialog控件
10:名称为prgBar1,进度条(ProgressBar),当要导入很多记录时,使用进度条可以指示当前的导入进度
11:名称为StatusBar1,状态条(StatusBar),指示导入的进展状态,包括“正在导入”,“导入完成”等。
 
要将Style设置为“1-sbrSimple”

在程序的头部作以下声明
Option Explicit
Dim Cn As New ADODB.Connection
Dim Cnmysql As New ADODB.Connection
Dim Rs As New ADODB.Recordset
Dim Rsmysql As New ADODB.Recordset

Function replace_str(srcstr As String)
srcstr = Replace(srcstr, "", "")
replace_str = Replace(srcstr, "'", "'")
End Function

双击form,在装载form时输入以下的代码
Private Sub Form_Load()
'将进度条设置为不可见
prgBar1.Visible = False
'连接mysql数据库,pwd为数据库的密码,uid为用户名,dsn为数据源的名称
Cnmysql.ConnectionString = "uid=root;pwd=;dsn=build"
Cnmysql.Open
End Sub

阅读全文