博文

SQL*PLUS命令的使用大全(1)(2007-04-23 10:39:00)

摘要: Oracle的sql*plus是与oracle进行交互的客户端工具。在sql*plus中,可以运行sql*plus命令与sql*plus语句。
   我们通常所说的DML、DDL、DCL语句都是sql*plus语句,它们执行完后,都可以保存在一个被称为sql buffer的内存区域中,并且只能保存一条最近执行的sql语句,我们可以对保存在sql buffer中的sql 语句进行修改,然后再次执行,sql*plus一般都与数据库打交道。
   除了sql*plus语句,在sql*plus中执行的其它语句我们称之为sql*plus命令。它们执行完后,不保存在sql buffer的内存区域中,它们一般用来对输出的结果进行格式化显示,以便于制作报表。
   下面就介绍一下一些常用的sql*plus命令: 
 
1. 执行一个SQL脚本文件
SQL>start file_>SQL>@ file_>我们可以将多条sql语句保存在一个文本文件中,这样当要执行这个文件中的所有的sql语句时,用上面的任一命令即可,这类似于dos中的批处理。 @与@@的区别是什么?
@等于start命令,用来运行一个sql脚本文件。
@命令调用当前目录下的,或指定全路径,或可以通过SQLPATH环境变量搜寻到的脚本文件。该命令使用是一般要指定要执行的文件的全路径,否则从缺省路径(可用SQLPATH变量指定)下读取指定的文件。
@@用在sql脚本文件中,用来说明用@@执行的sql脚本文件与@@所在的文件在同一目录下,而不用指定要执行sql脚本文件的全路径,也不是从SQLPATH环境变量指定的路径中寻找sql脚本文件,该命令一般用在脚本文件中。
如:在c:\temp目录下有文件start.sql和nest_start.sql,start.sql脚本文件的内容为:
@@nest_start.sql     - - 相当于@ c:\temp\nest_start.sql
则我们在sql*plus中,这样执行:
SQL> @ c:\temp\start.sql ......

阅读全文(4252) | 评论:0

SQL常用命令使用方法(2007-04-23 10:38:00)

摘要:1) 数据记录筛选: 
sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]" 

sql="select * from 数据表 where 字段名 like %字段值% order by 字段名 [desc]" 

sql="select top 10 * from 数据表 where 字段名 order by 字段名 [desc]" 

sql="select * from 数据表 where 字段名 in ( 值1 , 值2 , 值3 )" 

sql="select * from 数据表 where 字段名 between 值1 and 值2" 

(2) 更新数据记录: 

sql="update 数据表 set 字段名=字段值 where 条件表达式" 

sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式" 

(3) 删除数据记录: 

sql="delete from 数据表 where 条件表达式" 

sql="delete from 数据表" (将数据表所有......

阅读全文(4456) | 评论:0

transact---sql高级查询(下)(2006-05-07 16:47:00)

摘要: transact---sql高级查询(下)
5:使用having关键字来筛选结果
6:使用compute和compute by子句
7:使用嵌套查询
8:分布式查询 E:使用having关键字来筛选结果
    当完成对数据结果的查询和统计后,可以使用having关键字来对查询和计算的结果进行一步的筛选
      例:检索出work表中学历是大专或者是中专的人数
          select 学历,count(学历) from work group by 学历 having 学历 in(\'大专\',\'中专\')
          说明:1:having关键字都与group by用在一起.
               2:having不支持对列分配的别名
          例如:select 学历,\'大于5的人数\'=count(学历) from work group by 学历 having 大于5的人数>5 [错错]
          改为:select 学历,\'大于5的人数\'=count(学历) from work group by 学历 having count(学历)>5 F:使用compute和compute by
  使用compute子句允许同时观察查询所得到各列的数据的细节以及统计各列数据所产生的汇总列
      select * from work [查询所得到的各列的数据的细节]
 ......

阅读全文(3540) | 评论:0

transact---sql高级查询(上)(2006-05-07 16:47:00)

摘要: transact---sql高级查询(上)
1:多表的查询和笛卡儿积
2:表格别名的用法
3:使用sql server的统计函数
4:用group by子句实现分组的查询 A:多表查询和笛尔儿积
到目前为止,我们所用的都是单个表查询,但是在更多的情况的下,需要对多个表进行同时查询,这时可以把多个表的名字全部填写在from子句中.
  比如:查询出每个职工的姓名,学历,所在部门名称.由于我们需要的结果来自于两个表,所以必须用多表查询
       select 姓名,学历,部门名称,负责人 from work,部门 [分析为什么是错误的]
  原因:问题出在对表格连接条件的限制上.在上面的语句中,没能对表格连接条件作任何限制,所以sql会在work表中每取出一条记录,就与部门表中的所有记录组合一次,那么假设work表有m条记录,而部门表中有n条记录,则得出的结果为m*n条记录这就是笛尔儿积,所以笛尔儿积返回的大多数的结果是冗余的、无用的,所以应该避免笛尔儿积的产生.
  解决笛尔儿积的方法:事实上由于笛尔儿积是因为两个表的连接条件没有限制造成的,所以只要我们对两个表的连接进行条件限制,就可以避免笛尔儿积的产生.可以通过一个where子句,来连接两个表的公共的字段就可以了.
  所以将上面的语句改成:select 姓名,学历,部门名称,负责人 from work,部门 where work.部门编号=部门.部门编号 B:使用表格的别名
  A:当使用多个表进行查询时,如果有两个表中有相同的列,应该指明选中的是哪个表中的列.
    比如:在work表检索出在address表中都有的职工的职工号,姓名,学历,基本工资
         select 职工号,姓名,学历,基本工资 from work,address where work.职工号=address.职工号
         上......

阅读全文(3201) | 评论:1

数据库设计中的14个技巧(2006-04-24 20:16:00)

摘要:1. 原始单据与实体之间的关系
  可以是一对一、一对多、多对多的关系。在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体。在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个实体,或多张原始单证对应一个实体。这里的实体可以理解为基本表。明确这种对应关系后,对我们设计录入界面大有好处。   〖例1〗:一份员工履历资料,在人力资源信息系统中,就对应三个基本表:员工基本情况表、社会关系表、工作简历表。这就是“一张原始单证对应多个实体”的典型例子。
   2. 主键与外键
  一般而言,一个实体不能既无主键又无外键。在E—R 图中, 处于叶子部位的实体, 可以定义主键,也可以不定义主键(因为它无子孙), 但必须要有外键(因为它有父亲)。
  主键与外键的设计,在全局数据库的设计中,占有重要地位。当全局数据库的设计完成以后,有个美国数据库设计专家说:“键,到处都是键,除了键之外,什么也没有”,这就是他的数据库设计经验之谈,也反映了他对信息系统核心(数据模型)的高度抽象思想。因为:主键是实体的高度抽象,主键与外键的配对,表示实体之间的连接。
   3. 基本表的性质
  基本表与中间表、临时表不同,因为它具有如下四个特性:
   (1) 原子性。基本表中的字段是不可再分解的。
   (2) 原始性。基本表中的记录是原始数据(基础数据)的记录。
   (3) 演绎性。由基本表与代码表中的数据,可以派生出所有的输出数据。
   (4) 稳定性。基本表的结构是相对稳定的,表中的记录是要长期保存的。
理解基本表的性质后,在设计数据库时,就能将基本表与中间表、临时表区分开来。
   4. 范式标准
  基本表及其字段之间的关系, 应尽量满足第三范式。但是,满足第三范式的数据库设计,往往不是最好的设计。为了提高数据库的运行效率,常常需要降低范式标准:适当增加冗余,达到以空间换时间的目的。   〖例2〗:有一张存放商品的基本表,如表1所示。“金额”这个字段的存在,表明该表的设计不满足第三范式,因为“金额”可以由“单价”乘以“数量”得到,说明“金额”是冗余字段。但是,增加“金额”这个冗余字段,可以提高查询统计的速度,这就是以空间换时间的作法。
  在Rose ......

阅读全文(3433) | 评论:0

SQL Server安全-加密术和SQL注入攻击 (2006-04-24 19:25:00)

摘要:SQL Server上的加密术 SQL Server上内置了加密术用来保护各种类型的敏感数据。在很多时候,这个加密术对于你来说是完全透明的;当数据被存储时候被加密,它们被使用的时候就会自动加密。在其他的情况下,你可以选择数据是否要被加密。SQL Server可以加密下列这些组件: ·密码 ·存储过程,视图,触发器,用户自定义函数,默认值,和规则。 ·在服务器和用户之间传输的数据密码加密术 SQL Server自动将你分配给登陆和应用角色的密码加密。尽管当你可以从主数据库中直接察看系统表格而不需要密码。你不能给对这种情况作出任何修改,事实上,你根本不能破坏它。定义加密术 在有些时候,如果对对象进行加密是防止将一些信息分享给他人。例如,一个存储进程可能包含所有者的商业信息,但是这个信息不能和让其他的人看到,即使他们公开的系统表格并可以看到对象的定义。这就是为什么SQL Server允许你在创建一个对象的时候进行加密。为了加密一个存储进程,使用下面形式的CREAT PROCEDURE 语句: CREATE PROCEDURE procedurename [;number]

[@parameter datatype

[VARYING][ = defaultvalue][OUTPUT]]

[, …]

[WITH RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION] 我们关心的仅仅是可选的WITH参数。你可以详细说明ARECOMPILE或者ENCRYPTION,或者你可以同时说明它们。ENCRYPTION关键字保护SQL Server它不被公开在进程中。结果,如果ENCRYPTION在激活的时候系统存储进程sp_helptext就会被忽视,这个存储进程将被存储在用户创建进程的文本中。如果你不想要加密,你可以使用ALTER PROCEDURE,忽略WITH ENCRYPTION子句来重新创建一个进程。 为了能够使用加密术。用户和服务器都应该使用TCP/IP NetworkLibraries用来连接。运行适当的Network Utility和检查Force protocol encryption,看下表,用户和服务器之间的连接将不会被加密。
......

阅读全文(2766) | 评论:0

SQL Server 连接基础知识(2)(2006-04-24 19:25:00)

摘要:发送请求时,应首选 RPC 而非语言事件。为此,应在使用的 ADO 或 ADO.NET 对象中设置相应的属性。 执行动态 T-SQL 时,应在可能的情况下使用 sp_executesql 代替 EXEC()。唯一例外的情况是,当使用 EXEC() 的功能将查询片断连接而成的动态查询字符串的大小超过单个本地变量的存储大小时(这种情况非常少见)。 当遇到客户端问题,并且怀疑它可能和连接服务器时所用的对象库或 API 有关时,可以使用的一个故障排除技巧就是更改所用的客户端机制,这样可以将问题归结为特定的组件。例如,假设您升级 MDAC 并开始在 SQL Server 错误日志中看到 17805 错误,这表明客户端 ADO 应用程序发送的 TDS 数据包的格式不正确。您可能尝试让应用程序转为使用 ODBC 的 OLE DB 提供程序,如果您可以较为容易地做到这一点,应看看该问题是否与 SQLOLEDB 提供程序有一定的关系。相反,如果基于 ADO 的应用程序一直通过 ODBC 进行连接,则可以切换到 SQLOLEDB,看看这是否能解决问题,或至少帮助您缩小问题的范围。 同样,在对连接问题进行故障排除时,更改正在使用的 Net-Library 有时会有所帮助。如果使用 TCP/IP,命名管道也许值得一试。例如,如果 DHCP 服务器出现问题,并且没有有效的 IP 地址,则您将无法使用 TCP/IP 连接到 SQL Server。通过切换到命名管道,可以快速地将问题归结为 TCP/IP 特定的因素上。另一方面,如果在切换 Net Library 后仍存在同样的问题,则可以排除 Net-Library 方面的问题。问题的原因可能是服务器已关闭,或在您与服务器之间的某处网络基础设施无法正常工作。最后,还可以容易地更改应用程序使用的 Net-Library,而不必更改应用程序本身,这样就为您提供一个帮助缩小问题范围的工具。尽管从长远角度而言,使用某一特定 Net-Library 并不可行,但让客户端临时使用它可以帮助您缩小连接相关问题的范围。
......

阅读全文(3646) | 评论:0

SQL Server 连接基础知识(1)(2006-04-24 19:24:00)

摘要:   该堆栈的顶部是 API 或对象库层。应用程序通过对象库公开的 API 函数或接口连接到 Microsoft® SQL Server。用于访问 SQL Server 的 API 示例包括 ODBC 和 DB-Library。用于访问 SQL Server 的对象库示例包括 OLE DB、ADO 和 ADO.NET。由于 ADO 最终使用 OLE DB 与服务器通信,因此 Windows 应用程序在与 SQL Server 通信时实际上只使用两个常用的对象库,即 OLE DB 和 ADO.NET。由于通过 ADO 或 ADO.NET 进行连接通常比通过 ODBC 进行连接更普遍(但 SQL Server 的查询分析器和企业管理器仍通过 ODBC 进行连接),因此本文将从 ADO/OLE DB 和 ADO.NET 的角度介绍 SQL Server 连接体系结构的客户端。如今,大多数应用程序均通过对象库(而非 ODBC 或类似 API)连接到 SQL Server。 ADO 和 OLE DB OLE DB 客户端(也称作使用者)通过客户端提供程序与服务器以及其他后端程序进行通信。此提供程序是一组 COM 组件(一个或多个),用于将应用程序请求转换为网络进程间通信 (IPC) 请求。在使用 SQL Server 的情况下,最常用的 OLE DB 提供程序是 SQLOLEDB,它是 Microsoft 为 SQL Server 提供的 OLE DB 提供程序。SQLOLEDB 随附于 SQL Server 中,并作为 Microsoft 数据访问组件 (MDAC) 库的一部分安装。 为了使用 ADO 与 SQL Server 进行通信,应用程序首先使用 Connection 对象建立与服务器的连接。ADO 的 Connection 对象接受一个连接字符串,该字符串指定要使用的 OLE DB 提供程序以及传递给它的参数。如果应用程序使用 SQLOLEDB 提供程序连接到 SQL Server,则该字符串中将显示“SQLOLEDB”。 ADO 应用程序还可以通过 ODBC 连接到 SQL Server。为此,应用程序将使用适用于 ODBC 的 OLE DB 提供程序,并指定在其连接字符串中引用目标 SQL Server 的 ODBC......

阅读全文(3508) | 评论:0

SQL Server7移动数据的6种方法 (2006-04-24 19:23:00)

摘要:本人,对数据的移动有些心得体会,希望和大家共同交流。 1. 通过工具DTS的设计器进行导入或导出

DTS的设计器功能强大,支持多任务,也是可视化界面,容易操作,但知道的人一般不多,如果只是进行SQL Server数据库中部分表的移动,用这种方法最好,当然,也可以进行全部表的移动。在SQL Server Enterprise Manager中,展开服务器左边的 ,选择数据库,右击,选择All tasks/Import Data...(或All tasks/Export Data...),进入向导模式,按提示一步一步走就行了,里面分得很细,可以灵活的在不同数据源之间复制数据,很方便的。而且可以另存成DTS包,如果以后还有相同的复制任务,直接运行DTS包就行,省时省力。也可以直接打开DTS设计器,方法是展开服务器名称下面的Data Transformation Services,选Local Packages,在右边的窗口中右击,选New Package,就打开了DTS设计器。值得注意的是:如果源数据库要拷贝的表有外键,注意移动的顺序,有时要分批移动,否则外键主键,索引可能丢失,移动的时候选项旁边的提示说的很明白,或者一次性的复制到目标数据库中,再重新建立外键,主键,索引。

其实建立数据库时,建立外键,主键,索引的文件应该和建表文件分开,而且用的数据文件也分开,并分别放在不同的驱动器上,有利于数据库的优化。

2. 利用Bcp工具



这种工具虽然在SQL Server7的版本中不推荐使用,但许多数据库管理员仍很喜欢用它,尤其是用过SQL Server早期版本的人。Bcp有局限性,首先它的界面不是图形化的,其次它只是在SQL Server的表(视图)与文本文件之间进行复制,但它的优点是性能好,开销小,占用内存少,速度快。有兴趣的朋友可以查参考手册。

3. 利用备份和恢复



先对源数据库进行完全备份,备份到一个设备(device)上,然后把备份文件复制到目的服务器上(恢复的速度快),进行数据库的恢复操作,在恢复的数据库名中填上源数据库的名字(名字必须相同),选择强制型恢复(可以覆盖以前数据库的选项),在选择从设备中进行恢复,浏览时选中备份的文件就行了。这......

阅读全文(2737) | 评论:0

SA弱口令带来的安全隐患(2006-04-24 19:22:00)

摘要:存在Microsoft SQL Server SA弱口令漏洞的计算机一直是网络攻击者青睐的对象之一,通过这个漏洞,可以轻易的得到服务器的管理权限,从而威胁网络及数据的安全。作为网络管理员,我们可不能不闻不问,一定要弄清楚这其中的起因、经过和结果,才能有的放矢,做到更为有效的防范,下面我就详细的向大家介绍一下。 Microsoft SQLServer是一个c/s模式的强大的关系型数据库管理系统,应用领域十分广泛,从网站后台数据库到一些MIS(管理信息系统)到处都可以看到它的身影。网络中利用Microsoft SQLServer SA弱口令入侵的核心内容就是利用Microsoft SQLServer中的存储过程获得系统管理员权限,那到底什么是存储过程? 存储过程是存储在SQLServer中的预先写好的SQL语句集合,其中危险性最高的扩展存储过程就是xp_cmdshell了,它可以执行操作系统的任何指令,而SA是Microsoft SQLServer的管理员帐号,拥有最高权限,它可以执行扩展存储过程,并获得返回值,比如执行:exec master..xp_cmdshell 'net user test 1234 /add'和exec master..xp_cmdshell 'net localgroup administrators test /add'这样对方的系统就被添加了一个用户名为test,密码为1234,有管理员权限的用户,如图一所示。 图一(点击看原图) 现在你应该明白为什么得到SA密码,就可以得到系统的最高权限了吧。而往往不少网络管理员不清楚这个情况,为自己的SA用户起了一些诸如1234,4321等简单的密码,甚至根本就不设置密码,这样网络入侵者就可以利用一些黑客工具很轻松的扫描到SA的密码,进而控制计算机。 除了xp_cmdshell,还有一些存储过程也有可能会被入侵者利用到: 1、xp_regread(这个扩展存储过程可以读取注册表指定的键里指定的值),使用方法(得到机器名): DECLARE @test varchar(50) EXEC master..xp_regread @rootkey='HKEY_LOCAL_MACHINE', @key='system\controlset001\control\com......

阅读全文(2819) | 评论:0