SQL Server数据库程序设计知识总结

SQL Server是由Microsoft开发和推广的关系数据库管理系统(DBMS),它最初是由Microsoft、Sybase和Ashton-Tate三家公司共同开发的,并于1988年推出了第一个OS/2版本。它只是众多关系数据库管理系统的一种,其它的关系数据库管理系统还有Server,Oracle,DB/2,Sybase,Informix;关系数据库:Access,FoxPro,Dbase等。如今,数据库已经变成学习软件开发的核心课程之一,几乎绝大部分软件都涉及到数据库,很多数据必须存在数据库中。所以为了更好的掌握和操作数据库,对数据库知识的封装就显得尤为重要。

  ● 关系和非关系数据库

   关系数据库是创建在关系模型基础上的数据库,由一个或多个二维关系数据表组成,通过建立表之间的关系来定义数据库的结构。在关系数据库中最重要的是数据 表,数据表把相关联的数据按行和列排列到一起来描述一个实物。一个二维表称为一个关系,每一个关系又可以包含多个属性。

  和关系型数据库相比,非关系型数据库特别适合以SNS为代表web 2.0应用,这些应用需要极高速的并发读写操作,而对数值一致性要求却不甚高。关系数据库为了维护事务的一致性付出了重大代价导致了其读写能力下降,随着 现在网络SNS的应用对并发读写能力要求极高,关系型数据库已经无法应付,因此,必须用新的一种数据结构化存储来来代替关系数据库。关系数据库的另一个特 点就是其具有固定的表结构,因此,其扩展性极差,而在SNS中,系统的升级,功能的增加,往往意味着数据结构巨大改动,这一点关系型数据库也难以应付,需 要新的结构化数据存储。于是,非关系数据库(NoSQL)应运而生。非关系数据库通常没有固定的表结构,严格上说不是一种数据库,应该是一种数据结构化存 储方法的集合。

  ● SQL Server数据库基础

  首先我们从图中看他们之间的联系。

  一、T-SQL和SQL的比较

  SQL全称为Structured Query Language,是关系数据库的标准语言,它主要包括三种语言:  数据定义语言、数据操纵语言、数据控制语言。T-SQL是SQL语言的增强版。

   也就是说,SQL三种语言适用于所有关系型数据库,但是它本身具有局限性,因为它只提供了对数据库数据基本的增删改查等命令,在开发拥有复杂结构的数据 库程序时,只有SQL语言是远远不够的,于是各大公司在SQL基础上对它进行了增强。T-SQL是MS和Sybase在 SQL的DDL和 DML基础上,增加了延伸的函数、系统预存程序以及程式设计结构(例如 IF和 WHILE)让程式设计更有弹性。和T-SQL类似的增强版的SQL语言还有Oracle对SQL的扩展PL/SQL。

  二、数据库对象

  数据库对象定义了数据库内容的结构。它们包含在数据库项目中,数据库项目还可以包含数据生成计划和脚本。 在学习SQL Server时,最快的方法是先学习数据库对象。在研究了它们之间的异同点后,我把数据库对象分为三类。

 这三类数据库对象在功能上可能有重叠。

  1、基于表的对象

  表,数据保存在表中。

  基于表的对象我把它分为三类:

  视图,用来筛选出用户想要的信息,它是虚拟表,只封装语句,一定程度上保证表中数据的安全;

  索引,对数据库表中一个或多个列的值进行排序的结构,提供指针以指向存储在表中指定列的数据值,然后根据指定的排序次序排列这些指针。数据库使用索引的方式与使用书的目录很相似;

  约束、默认值、规则、触发器确保了数据完整性。

  2、数据库安全性:用户、角色、权限与数据库安全性中的登陆联合应用可以限制登陆者可进行的操作来保证数据库的安全性。

  3、块:存储过程和函数有点相似,但是存储过程可以返回Recordset;触发器是一种特殊的存储过程。

  三、DTS数据转换服务

  DTS的主要作用:1、导入与导出数据

  2、转换数据(检验、净化、重整数据)

  3、转换数据库对象

  四、管理和维护

  在这部分中主要是对数据库文件的保护和管理。

  1、数据库文件

  数据库文件是存放数据库数据和数据库对象的文件。一个数据库可以有一个或多个数据库文件,一个数据库文件只属于一个 数据库。当有多个数据库文件时,有一个文件被定义为主数据库文件,扩展名为.mdf,它用来存储数据库的启动信息和部分或全部数据。一个数据库只能有一个 主数据库文件,其它数据库文件被称为次要数据库文件,扩展名为.ndf,用来存储主文件没存储的其它数据。

  多个数据库文件组合到一块就成为文件组。主文件组是由主文件组合成,此文件组是由此文件组合成,但是事务日志文件不属于任何一个文件组。

  2、事务和锁

  事务

  事务(Transaction)是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。

  事务通常是以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。

  COMMIT表示提交,即提交事务的所有操作。具体地说就是将事务中所有对数据库的更新写回到磁盘上的物理数据库中去,事务正常结束。

  ROLLBACK表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库的所有以完成的操作全部撤消,回滚到事务开始的状态。

  锁

  数据库就是通过锁机制来解决并发问题的。。主要就是两种锁,共享锁和排他锁(也叫独占锁)。

  从程序员的角度看锁分为以下两种类型:

  乐观锁(Optimistic Lock):乐观锁假定在处理数据时,不需要在应用程序的代码中做任何事情就可以直接在记录上加锁、即完全依靠数据库来管理锁的工作。一般情况下,当执行事务处理时SQL Server会自动对事务处理范围内更新到的表做锁定。

  悲观锁(Pessimistic Lock):悲观锁对数据库系统的自动管理不感冒,需要程序员直接管理数据或对象上的加锁处理,并负责获取、共享和放弃正在使用的数据上的任何锁。

  ● 应用实例


/*--下面我们新建一个名为company的数据库,创建三个表priduct、project、tblsales,并在其中创建默认值、规则、触发器、存储过程,并利用用户、角色、权限等确保数据库安全。*/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_priduct_project]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[priduct] DROP CONSTRAINT FK_priduct_project
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[getavgpbiaodi]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[getavgpbiaodi]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[pinfo5000]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[pinfo5000]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[pro]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[pro]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sysconstraints]') and OBJECTPROPERTY(id, N'IsView') = 1)
drop view [dbo].[sysconstraints]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[priduct]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[priduct]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[project]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[project]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tblsales]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[tblsales]
GO

if exists (select * from dbo.systypes where name = N'tele')
exec sp_droptype N'tele'
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[rule_position]') and OBJECTPROPERTY(id, N'IsRule') = 1)
drop rule [dbo].[rule_position]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[@position]') and OBJECTPROPERTY(id, N'IsDefault') = 1)
drop default [dbo].[@position]
GO

create default [@position] as '其它'
GO
create rule [rule_position] as @postion in('项目经理','秘书','会计','职员','其它')
GO
setuser
GO

EXEC sp_addtype N'tele', N'smallint', N'not null'
GO

setuser
GO

CREATE TABLE [dbo].[priduct] (
 [产品ID] [int] NULL ,
 [产品名称] [char] (20) COLLATE Chinese_PRC_CI_AS NULL 
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[project] (
 [项目编号] [int] NOT NULL ,
 [项目名称] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
 [开始日期] [datetime] NULL ,
 [预计日期] [int] NULL ,
 [客户编号] [int] NULL ,
 [负责人编号] [int] NULL ,
 [项目标的] [int] NULL 
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[tblsales] (
 [number] [int] NOT NULL ,
 [name] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
 [sex] [char] (2) COLLATE Chinese_PRC_CI_AS NULL ,
 [birthday] [datetime] NULL ,
 [salary] [money] NULL 
) ON [PRIMARY]
GO

setuser
GO

EXEC sp_bindefault N'[dbo].[@position]', N'[project].[项目标的]'
GO

EXEC sp_bindrule N'[dbo].[rule_position]', N'[project].[项目名称]'
GO

setuser
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO

--/****** Encrypted object is not transferable, and script can not be generated. ******/

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO

create procedure getavgpbiaodi
@name varchar(10),@avgpbiaodi int output
as 
declare @errorsave int
set @errorsave=0
select @avgpbiaodi=avg(项目标的)
from project as p inner join pmanager as pm on p.负责人ID=pm.负责人ID
where pm.姓名=@name
if(@@error<>0)
 set @errorsave=@@error
 return @errorsave

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO

create procedure pinfo5000
as select * from project where 项目标的>=5000
order by 项目标的 desc

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO

create procedure pro
@n1 int,@n2 int,@n3 int,@avreage int output
as select
@avreage=(@n1+@n2+@n3)/3
declare @avgscore int
exec pro1 1,2,3,@avgscore output
select 'The score is:',@avgscore

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

  SQL Server的基础框架知识,我现在只能总结这么多,更多的总结还是在以后一点一滴的学习中。

====================================分割线================================

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-11-03 08:40:03

SQL Server数据库程序设计知识总结的相关文章

sql server-如何在SQL Server 数据库中调用JAVA程序

问题描述 如何在SQL Server 数据库中调用JAVA程序 工作中 遇到一个实际的问题如下: 一个在线的SQL server数据库A,他的一个触发器在数据库有更新时把新的数据插入的到另一个SQL server 数据库B,已经写好的一个JAVA程序可以把B中的数据全部复制到一个Oracle 数据库C中,并且立即把数据库B中的数据清空.现在希望这个程序能够自动执行,就是JAVA程序能够在检测到B中有新数据后立即开始自动执行.我已经知道对于Oracle数据库可以通过触发器直接调用JAVA程序,可是

T-sql语句修改SQL Server数据库逻辑名、数据库名、物理名的方法_MsSql

本文实例讲述了T-sql语句修改SQL Server数据库逻辑名.数据库名.物理名的方法.分享给大家供大家参考,具体如下: 更改MSSQL数据库物理文件名Sql语句的写法 注意:要在活动监视器里面确保没有进程连接你要改名的数据库!!!!!!!!!!!!!!!!!!!! Sql语句如下 USE master --改逻辑名 ALTER DATABASE YQBlog MODIFY FILE(NAME='YQBlogAA',NEWNAME='YQBlog') -- GO ALTER DATABASE

SQL SERVER数据库口令的脆弱性

跟踪了一下SQL SERVER数据库服务器的登录过程,发现口令计算是非常脆弱的,SQL SERVER数据库的口令脆弱体现两方面: 1.网络登陆时候的口令加密算法 2.数据库存储的口令加密算法. 下面就分别讲述: 1.网络登陆时候的口令加密算法 SQL SERVER网络加密的口令一直都非常脆弱,网上有很多写出来的对照表,但是都没有具体的算法处理,实际上跟踪一下SQL SERVER的登陆过程,就很容易获取其解密的算法:好吧,我们还是演示一下汇编流程: 登录类型的TDS包跳转到4126a4处执行: 0

Sql server数据库备份的三个恢复模型

server|备份|恢复|数据|数据库 在SQL Server 2000中,有无数种备份数据库的方法.无论你的数据库有多大.改变是否频繁,都有满足你的要求的备份策略.让我们看看几种可以在不同环境下工作的基本备份策略. 本文假定你有备份数据库的权限.也就是说,你要么是系统管理员,要么是db_owner或者backupadministrator.还有,我们还假定你的操作系统提供了访问备份所需要的资源的权利,例如,访问磁盘或者磁带驱动器. 从哪儿开始 在你开始备份一个SQL Server数据库之前,你

强烈推荐:SQL Server数据库操作实用技巧锦集

server|sql|技巧|数据|数据库 本文主要概括安装时提示有挂起的操作.收缩数据库.压缩数据库.转移数据库给新用户以已存在用户权限.检查备份集.修复数据库等操作技巧. 1.挂起操作 在安装SQL或SP补丁的时候系统提示之前有挂起的安装操作,要求重启,这里往往重启无用,解决办法: 到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager删除PendingFileRenameOperations. 2.收缩数据库

Vb.net向sql server数据库中保存图片(一)

server|数据|数据库 预备知识:STREAM.ADO.NET 微软的SQL SERVER数据库的Image.text等字段都属于二进制的大对象.这些对象的存取和其他轻型对象略有不同.比如,我们打开一个数据表的时候,普通类型的字段都可以看见,而Image类型的字段却不行,只能通过编程的方法来读取.这篇资料就是介绍怎样用vb.NET来向sql server数据库中存放图片,怎样从数据库中取出图片浏览.我在这里也费了老大的精力,主要是为了答复一个同学的提问.(他刨根问底式的学习方式,把我急出一身

如何解决SQL Server数据库的"User, group, or role already exists

问题场景 在SQL Server数据库迁移时,在另外一台服务器上恢复数据库备份文件之后,需要重新创建之前数据库上的用户帐户.在创建登录用户时,需要在User Mapping中给该用户针对具体的数据库进行授权,由于恢复出来的数据库中存在同名的用户帐户,创建时会出现"User, group, or role already exists in the current database"的错误提示.详细错误信息如下: TITLE: Microsoft SQL Server Managemen

从客户端提升SQL Server数据库性能

第一:编写限制搜索范围的查询语句. 众所周知,在数据库查询的时候返回记录的多少直接关系到查询的效率.所以,在客户端通过一定的条件语句,限制搜索的范围,往往可以大幅度的提高查询的效率. 如用户在客户端查询数据库的时候,在查询语句中,加入TOP语句,让其显示前面的50条或者100条记录.因为根据经验,用户在查询数据的时候,60%左右要查看的都是靠前面的记录.特别是在一些历史交易信息表中,如在ERP系统的库存交易表中,就可以只显示前面几百条的记录,而不需要显示所有的记录.当用户觉得记录不够时,可以按"

理解和处理SQL Server数据库中的孤立用户

问题 把数据库从一个服务器实例附加和恢复到另一个实例中是数据库管理 员执行的常见的任务.附加或者恢复一个数据库之后,之前在数据库中创建和配 置的登录名已经不能访问了.这个问题最常见的症状是应用程序会遇到登录失败 的错误,或者是当你试着把登录名添加到数据库中时,你可能会得到一个信息比 如这个用户已经在这个数据库中存在.当你执行一个附加或者一个恢复时,这是 很常见的一种情况,那么你如何解决这个问题呢? 专家解答 当数据 库从一个服务器迁移到另一个服务器时,存储在主从数据库中的登录名ids与存储 在每