免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: tigerfish
打印 上一主题 下一主题

Ms SQL常见问题收集整理集(不断收集中...) [复制链接]

论坛徽章:
0
41 [报告]
发表于 2003-12-10 09:32 |只看该作者
利用数据库复制技术 实现数据同步更新
复制的概念
复制是将一组数据从一个数据源拷贝到多个数据源的技术,是将一份数据发布到多个存储站点上的有效方式。使用复制技术,用户可以将一份数据发布到多台服务器上,从而使不同的服务器用户都可以在权限的许可的范围内共享这份数据。复制技术可以确保分布在不同地点的数据自动同步更新,从而保证数据的一致性。
SQL复制的基本元素包括
出版服务器、订阅服务器、分发服务器、出版物、文章
SQL复制的工作原理
SQL SERVER 主要采用出版物、订阅的方式来处理复制。源数据所在的服务器是出版服务器,负责发表数据。出版服务器把要发表的数据的所有改变情况的拷贝复制到分发服务器,分发服务器包含有一个分发数据库,可接收数据的所有改变,并保存这些改变,再把这些改变分发给订阅服务器
SQL SERVER复制技术类型
SQL SERVER提供了三种复制技术,分别是:
1、快照复制(呆会我们就使用这个)
2、事务复制
3、合并复制
只要把上面这些概念弄清楚了那么对复制也就有了一定的理解。接下来我们就一步一步来实现复制的步骤。
第一先来配置出版服务器
(1)选中指定[服务器]节点
(2)从[工具]下拉菜单的[复制]子菜单中选择[发布、订阅服务器和分发]命令
(3)系统弹出一个对话框点[下一步]然后看着提示一直操作到完成。
(4)当完成了出版服务器的设置以后系统会为该服务器的树形结构中添加一个复制监视器。同时也生成一个分发数据库(distribution)
第二创建出版物
(1)选中指定的服务器
(2)从[工具]菜单的[复制]子菜单中选择[创建和管理发布]命令。此时系统会弹出一个对话框
(3)选择要创建出版物的数据库,然后单击[创建发布]
(4)在[创建发布向导]的提示对话框中单击[下一步]系统就会弹出一个对话框。对话框上的内容是复制的三个类型。我们现在选第一个也就是默认的快照发布(其他两个大家可以去看看帮助)
(5)单击[下一步]系统要求指定可以订阅该发布的数据库服务器类型,SQLSERVER允许在不同的数据库如 ORACLE或ACCESS之间进行数据复制。但是在这里我们选择运行\"SQL SERVER 2000\"的数据库服务器
(6)单击[下一步]系统就弹出一个定义文章的对话框也就是选择要出版的表
(7)然后[下一步]直到操作完成。当完成出版物的创建后创建出版物的数据库也就变成了一个共享数据库。
第三设计订阅
(1)选中指定的订阅服务器
(2)从[工具]下拉菜单中选择[复制]子菜单的[请求订阅]
(3)按照单击[下一步]操作直到系统会提示检查SQL SERVER代理服务的运行状态,执行复制操作的前提条件是SQL SERVER代理服务必须已经启动。
(4)单击[完成]。完成订阅操作。
完成上面的步骤其实复制也就是成功了。但是如何来知道复制是否成功了呢?这里可以通过这种方法来快速看是否成功。展开出版服务器下面的复制——发布内容——右键发布内容——属性——击活——状态然后点立即运行代理程序接着点代理程序属性击活调度把调度设置为每一天发生,每一分钟,在0:00:00和23:59:59之间。接下来就是判断复制是否成功了打开C:\\Program Files\\Microsoft SQL Server\\MSSQL\\REPLDATA\\unc\\XIAOWANGZI_database_database下面看是不是有一些以时间做为文件名的文件夹差不多一分中就产生一个。要是你还不信的话就打开你的数据库看在订阅的服务器的指定订阅数据库下看是不是看到了你刚才所发布的表

论坛徽章:
0
42 [报告]
发表于 2003-12-10 09:33 |只看该作者
--一个手工同步的方案

--定时同步服务器上的数据

--例子:
--测试环境,SQL Server2000,远程服务器名z,用户名为:sa,无密码,测试数据库:test
--服务器上的表(查询分析器连接到服务器上创建)
create table [user](id int primary key,number varchar(4),name varchar(10))
go
--以下在局域网(本机操作)
--本机的表,state说明:null 表示新增记录,1 表示修改过的记录,0 表示无变化的记录
if exists (select * from dbo.sysobjects where id = object_id(N\'[user]\') and OBJECTPROPERTY(id, N\'IsUserTable\') = 1)
        drop table [user]
GO
create table [user](id int identity(1,1),number varchar(4),name varchar(10),state bit)
go
--创建触发器,维护state字段的值
create trigger t_state on [user]
after update
as
update [user] set state=1
from [user] a join inserted b on a.id=b.id
where a.state is not null
go

--为了方便同步处理,创建链接服务器到要同步的服务器
--这里的远程服务器名为z,用户名为:sa,无密码
if exists(select 1 from master..sysservers where srvname=\'srv_lnk\')
        exec sp_dropserver \'srv_lnk\',\'droplogins\'
go
exec sp_addlinkedserver  \'srv_lnk\',\'\',\'SQLOLEDB\',\'xz\'
exec sp_addlinkedsrvlogin \'srv_lnk\',\'false\',null,\'sa\'
go

--创建同步处理的存储过程
if exists (select * from dbo.sysobjects where id = object_id(N\'[dbo].[p_synchro]\') and OBJECTPROPERTY(id, N\'IsProcedure\') = 1)
        drop procedure [dbo].[p_synchro]
GO
create proc p_synchro
as
--set  XACT_ABORT on
--启动远程服务器的MSDTC服务
--exec master..xp_cmdshell \'isql /S\"xz\" /U\"sa\" /P\"\" /q\"exec master..xp_cmdshell \'\'net start msdtc\'\',no_output\"\',no_output

--启动本机的MSDTC服务
--exec master..xp_cmdshell \'net start msdtc\',no_output

--进行分布事务处理,如果表用标识列做主键,用下面的方法
--BEGIN DISTRIBUTED TRANSACTION
        --同步删除的数据
        delete from srv_lnk.test.dbo.[user]
                where id not in(select id from [user])

        --同步新增的数据
        insert into srv_lnk.test.dbo.[user]
        select id,number,name from [user] where state is null
       
        --同步修改的数据
        update srv_lnk.test.dbo.[user] set
                number=b.number,name=b.name
        from srv_lnk.test.dbo.[user] a
                join [user] b on a.id=b.id
        where b.state=1
       
        --同步后更新本机的标志
        update [user] set state=0 where isnull(state,1)=1
--COMMIT TRAN
go

--创建作业,定时执行数据同步的存储过程
if exists(SELECT 1 from msdb..sysjobs where name=\'数据处理\')
        EXECUTE msdb.dbo.sp_delete_job @job_name=\'数据处理\'
exec msdb..sp_add_job @job_name=\'数据处理\'

--创建作业步骤
declare @sql varchar(800),@dbname varchar(250)
select @sql=\'exec p_synchro\'          --数据处理的命令
        ,@dbname=db_name()                        --执行数据处理的数据库名

exec msdb..sp_add_jobstep @job_name=\'数据处理\',
        @step_name = \'数据同步\',
        @subsystem = \'TSQL\',
        @database_name=@dbname,
           @command = @sql,
        @retry_attempts = 5,                 --重试次数
        @retry_interval = 5                  --重试间隔

--创建调度
EXEC msdb..sp_add_jobschedule @job_name = \'数据处理\',
        @name = \'时间安排\',
        @freq_type = 4,                                 --每天
        @freq_interval = 1,                                --每天执行一次
        @active_start_time = 00000                --0点执行
go

论坛徽章:
0
43 [报告]
发表于 2003-12-13 09:10 |只看该作者

Re: 锁问题

最初由 wangyuzhen 发布
[B]觉得锁问题在我们这里没有表现,因为我们用的PowerBuilder在提交修改时可以带上where条件,指定被修改字段必须和上次访问时的值一致才可以。
另外觉得那个例子有问题,为什么要提交25,000?而不是:存款余额+5000? [/B]

那个例子是为了说明加锁的意义,

这个操作要这样完成

1. 从表中取出余额存款记录
2. 存款余额+5000 写回表中

如有两个并行操作同时完成1操作, 就会产生问题
因此, 在执行1,2操作是一定要对记录加锁, 以保证一次只有一个操作在执行.
你的问题只是一个如何实现的问题, 提价存款余额+5000时, 这个锁是由数据库自动实现的, 因为每条UPDATE语句在执行的时候都会先对目标记录加锁.

论坛徽章:
0
44 [报告]
发表于 2003-12-15 13:00 |只看该作者
SQL Server如何解决加密问题?

---摘自互联网
SQL Server的6.0和6.5版本中,16位和32位客户软件在使用多协议网络库时设置加密选项可以进行数据在线加密。
 SQL Server依靠Microsoft Windows NT RPC 应用程序接口来完成网络数据加密。 Windows NT RPC使用40位RC4加密方法。这种方法允许出口,所以美国和国际版的这种加密方法没有区别。

论坛徽章:
0
45 [报告]
发表于 2003-12-15 13:01 |只看该作者
编写数据库脚本

作者:Andrew Clinick
发表日期:2000 年 1 月 10 日
我在“If It Moves, Script It”(英文)(http://msdn.microsoft.com/worksh ... scripting061499.asp)这篇文章中曾谈到,如何使用“Windows Script Host(WSH)”( Windows 脚本主机) 管理 Windows 和 Windows 中的应用程序。文中的大多数示例都是基于管理 Windows 操作系统自身的,并不基于在该操作系统下运行的应用程序。为迎接新千年,我想我应该谈谈,如何在众多显露可脚本化接口的应用程序中使用脚本。这次只涉及“SQL Server”。在以后的几个月中,我将着重谈 Exchange、Office 和“系统管理服务器”。
--------------------------------------------------------------------------------
您可以通过使用“分布式管理对象”、“数据转换服务”和新的“SQL Server XML”实现,将脚本用于“SQL Server”。
--------------------------------------------------------------------------------

许多人都能够通过“Active Data Object(ADO)”和“Active Server Page (ASP)”技术访问数据库了。ADO 在帮助您查询和更新数据库方面做了大量的工作 — 但在备份(Y2K 问题带给我们的警惕)或是数据库之间的传输数据方面,其表现又如何呢?而这时就非涉及到 XML 不可了。
在此,我将告诉您如何通过使用 ADO 的伴随技术 - 特别是“分布式管理对象”、“数据转换服务”和新的“SQL Server XML”实现,将脚本用于“SQL Server”。
分布式管理对象

“分布式管理对象 (DMO)”是一组 COM 对象,它将“SQL Server”数据库和复制管理封装在一起。这意味着您可以编写一个 WSH 脚本,将特定表中的所有数据都复制到用制表符分隔的文件中,这有助于大量数据的移动。我之所以选择这个示例,是因为它的代码编写起来简单,但 DMO 允许您获取“SQL Server”中的每个对象,使您能够编写出一些非常优秀而有意义的管理脚本。
DMO 的关键是 SQLDMO.SQLServer 对象,它是基本的对象,它允许您连接到服务器并获取所有可用对象。在这种情况下,我将使用 Database 集合来选择数据库,然后从 table 集合访问要转储到文件的表。如果不提供数据库,将出现错误消息,并且脚本也就结束了。如果不提供表名,脚本将在数据库所有的表中循环,并导出非系统表。如果提供了数据库,它就导出该表。该示例虽然功能有限,但它为“SQL Server”提供了基于命令行的简单的导出实用程序,您可以以它为根据。
现在先看一段代码:


\'声明与 sql 谈话时使用的变量
Dim oServer \' SQL Server 对象
Dim oDatabase \' 要使用的目标数据库
Dim oBCP \' BCP 对象
Dim nRows \' 从 bcp 返回的行数
dim table \' 表对象
on error resume next
\' 第一个参数必须是数据库
if WScript.Arguments(0) = \"\" then
    WScript.Echo \"您没有提供要连接的数据库\"    WScript.Quit
end if
\' 创建 SQL DMO 的实例
Set oServer = CreateObject(\"SQLDMO.SQLServer\"
\' 创建 SQL DMO Bulkcopy 对象的实例
Set oBCP = CreateObject(\"SQLDMO.BulkCopy\"
oServer.EnableBcp = True
\' 登录到本地服务器
\' 希望您已经更改了 sa 口令!!
oServer.Connect \".\", \"sa\"
\' 连接到提供的数据库
Set oDatabase = oServer.Databases(Wscript.Arguments(0))

\' 将分隔符设置为逗号
oBCP.ColumnDelimiter = vbComma
\' 将文件类型设置为以逗号分隔
oBCP.DataFileType = SQLDMODataFile_CommaDelimitedChar
oBCP.ImportRowsPerBatch = 1000
oBCP.MaximumErrorsBeforeAbort = 1
BCP.RowDelimiter = vbCrLf
oBCP.ServerBCPDataFileType = SQLDMOBCPDataFile_Char
oBCP.UseExistingConnection = True
\' 如果未提供表,则转储所有的表
if wscript.Arguments(1) = \"\" then
    for each table in oDatabase.tables
        \' 确保该表不是系统表
        if table.systemobject = false then
            oBCP.DataFilePath = table.name & \".csv\"
            nRows = table.ExportData(oBCP)
            wscript.Echo nRows & \" rows exported from \" & table.name
        end if
    nextelse    \' 设置输出文件
    oBCP.DataFilePath = wscript.Arguments(1) & \".csv\"
     nRows = oDatabase.Tables(wscript.arguments(1)).ExportData(oBCP)
    wscript.Echo nRows & \" rows exported from \" & wscript.arguments(1)
end if


DMO 的全部内容要比本文介绍的多得多,但我希望本文能给您一些感性认识:用某些简单的 WSH 脚本和 DMO 可以做些什么。您可以下载我的示例(英文)(http://msdn.microsoft.com/voices/sqlexport.wsf)。有关 DMO 的详细信息,请访问 http://msdn.microsoft.com/library/psdk/sql/9_dmoc01.htm(英文)(http://msdn.microsoft.com/library/psdk/sql/9_dmoc01.htm)。
数据转换服务

导出到 Comma Separated 文件 (CSV),可以作为将数据导出到 SQL 和从 SQL 导入的起点,但这不象是尖端科技(太过于 20 世纪了,您不觉得吗?)。“SQL Server 7.0”以“数据转换服务 (DTS)”的形式,提供了相当完善的导入和导出机制。幸运的是,脚本在“SQL Server”的这个新领域中仍有一席之地,因此,您可以用“Visual Basic(R) 脚本编辑 (VBScript)”、“JScript(R)”或“Perl”的技术来扩展 DTS 的能力。
DTS 的设置非常简单,特别是在使用“SQL ServerEnterprise Manager”的时候。在默认情况下,“SQL Server”有一个定义的文件夹,可存储任何转换,而且“Enterprise Manager”提供了创建和编辑 DTS 程序包的大的图形用户界面 (GUI)。在下面的示例中,我选择了已由 sqlexport.wsf 文件创建的 employees.csv 文件和“SQL Server”中的一个新表。DTA 程序包将创建该表,加载到 Text 文件中,然后运行某个脚本,将数据转换到“SQL Server”的表中。

DTS 程序包中的转换,使脚本在整个转换过程中保持运行状态。“SQL Enterprise Manager”提供的简单的脚本编辑器,有一个语法分析脚本按钮。在运行脚本之前,该按钮将警告您脚本中的错误。在转换过程中,该脚本使用 VBScript 的 Cint 功能,将 employeeid 和 deptid 的输入转换为 int,并将所有的电子邮件地址转换为小写字母。

\'**********************************************************************
\'     Visual Basic 转换脚本
\'     把每个源列复制到
\'     目标列
\'***********************************************************************
Function Main()
    DTSDestination(\"EmployeeID\" = cint(DTSSource(\"Col001\")
    DTSDestination(\"FirstName\" = DTSSource(\"Col002\"
    DTSDestination(\"LastName\" = DTSSource(\"Col003\"
    DTSDestination(\"email\" = lcase(DTSSource(\"Col004\")
    DTSDestination(\"extension\") = DTSSource(\"Col005\")
    DTSDestination(\"office\") = DTSSource(\"Col006\")
    DTSDestination(\"DeptID\") = cint(DTSSource(\"Col007\"))
    Main = DTSTransformStat_OK
End Function


用 DTS,能够采用某些完善的导入/导出机制,并使您能够在转换的任何一步中使用脚本。重要的是,要注意脚本可能不是操作数据的最佳方式 — 尤其是您的数据集很大的话。如果您有大量数据需要转换,而且性能也很重要,则您可能需要考虑使用 Visual Basic 或 C++ 来创建 COM 组件,然后从 DTS 内部调用该组件。也就是说,如果性能并不重要,并且要在数据导入/导出时对它进行转换,则脚本为您提供了实现这一点的灵活机制,并使您能够将所有代码存储到“SQL Server”数据库中,使部署变得相当简单。
关于 XML

目前,XML 看起来像是在应用程序之间共享数据的最佳工具,所以“SQL Server”的所有管理肯定都得到了 XML 的好处。编写提取数据库中所有数据的脚本,以及编写用编程的方法创建 XML 文档的脚本,都是可能的。但是,如果您只要查询“SQL Server”的话,最好使它在 XML 中返回数据,然后用脚本操作该 XML。“SQL Server”组最近发行了“SQL Server XML”技术的非正式版本,完全做到了这一点。
新的 XML 技术使用起来非常简单。实际上是对服务器发出 HTTP 请求,将查询传递给服务器,而服务器返回 XML。为了举例说明,我创建了简单的 WSH 脚本,它向本地机器查询 North Wind 数据库的雇员表中的所有数据。为访问 XML,该脚本使用了“Internet Explorer 5.01”附带的 XML 分析程序。此对象的美妙之处,在于它处理您所有的 HTTP 请求,并使您能够同步调用。因为您再也不用处理任何事件驱动的程序,所以,它对编写脚本很有帮助。
该脚本非常简单。它创建了 XML 分析程序的实例,使用分析程序打开 URL,然后将结果保存为 .xml 文件。只需五行的脚本,不错吧!


\' 设置请求的 url
xmlpath = \"http://localhost/Northwind?sql=select+*+from+employees+for+xml+auto\"
\' 创建“XML 分析程序”的实例
Set myXMLDoc = CreateObject(\"Microsoft.XMLDOM\")
\' 不需要异步
myXMLDoc.async = false
\' 加载该 URL
myXMLDoc.Load xmlpath
\' 保存文档
myXMLDoc.save \"employees.xml\"


它的强大之处在于,现在可很容易地与服务器建立远程连接并转储数据;只要更改 URL,您早已做过了。此例告诉您如何导出,但是您可以轻松地写出导入例行程序,用 XML 分析程序在 XML 中反复操作并将值插入数据库中。
摘要

“SQL Server”提供全面的可编写脚本的机制,用于本地或远程管理数据库。DMO 和 DTS 已经上市(实际上,DMO 已发行了许多版本),所以您可以直接利用它们,使您的数据库管理任务自动化。Windows 2000 已与“Windows Script Host 2.0”一起上市,所以以上所有脚本的运行,都不受装有“SQL Server”的 Windows 2000 服务器的条件限制。“SQL Server”中新的 XML 技术使存取数据变得轻而易举,从而使编写“SQL Server”的脚本更加容易。有关“SQL Server”的详细信息,请访问 SQL Server Developer enter(英文)(http://msdn.microsoft.com/sqlserver/)。

论坛徽章:
0
46 [报告]
发表于 2003-12-15 13:02 |只看该作者
怎样才能限制SQL Server只能让指定的机器连接

---摘自《SQL编程技巧站》
Q. How can I restrict access to my SQL Server so that it only allows certain machines to connect?
(v1.0 19.10.199


怎样才能限制我的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)

论坛徽章:
0
47 [报告]
发表于 2003-12-15 13:03 |只看该作者
编程管理SQL SERVER的帐号

---摘自《SQL编程技巧站》(文/Water)
每个人都关心数据安全。如果不关心的话,可能没有意识到访问服务器中的敏感数据是非常容易的。因为SQL SERVER在这方面已经替我们考虑过了,所以在我们开发应用程序就可以直接使用SQL SERVER的安全策略。

    在SQL SERVER中,我们可以在ENTERPRISE MANAGER中创建一个登录帐号,并且赋予一定的权限,如果要做到我们的应用程序中呢?

    SQL SERVER提供了如下系统过程

    一、SP_ADDLOGIN    添加登录帐号

        SP_ADDLOGIN login_id[,password[,defaultdb[,defaultlanguage]]]

        login_id          帐号名
        password          口令
        defaultdb         缺省数据库,默认为MASTER数据库。
        defaultlanguage   缺省语言

    二、SP_ADDUSER    添加用户

        SP_ADDUSER login_id[,username[,rolename]]

        username          登录数据库的别名
        rolename          用户隶属的组名

    三、SP_DROPLOGIN  删除帐号

        SP_DROPLOGIN login_id

    四、SP_DROPUSER   删除用户

        SP_DROPUSER username

    五、GRANT         授予用户或组许可权限

        GRANT permission_list ON object_name TO name_list

        permission_list    授予的权限的清单
        object_name        被授予权限的表、视图或存储过程
        name_list          被授予权限的用户或组的清单

    六、REVOKE        收回用户或组许可权限

        REVOKE permission_list ON object_name FROM name_list

    七、SP_PASSWORD   修改口令

        SP_PASSWORD [old_password,]new_password[,login_id]

    前六个过程只能SA或被SA授予Security Administrators权限的人才可使用,第七个过程普通用户可能使用,但不能使用login_id项,只有上述权限的人才可使用此项

 

应用实例:

    添加

        declare @login varchar(6),@pass varchar(11)

        exec sp_addlogin @login,@pass,databasename
        exec sp_adduser @login,@login,public

        grant insert,select,update,delete on table1 to public

    删除        

        revoke insert,delete on table1 from public

        exec sp_dropuser @login
        exec sp_droplogin @login

    本文代码在NT4+SQL7和WIN98+SQL7和NT4+SQL6.5中测试通过

    参考资料:SQL Server 7.0 开发指南

论坛徽章:
0
48 [报告]
发表于 2003-12-15 13:04 |只看该作者
浅析数据完整性问题

---摘自《ChinaASP网络》
浅 析 数 据 完 整 性 问 题

内 蒙 环 境 信 息 中 心
王 阔 涛
---- 在 开 发C/S 结 构 的 大 型 数 据 库 应 用 软 件 时, 一 般 情 况 下, 软 件 开 发 人 员 和 数 据 库 设 计 人 员 并 不 是 同 一 个 人, 这 就 需 要 协 商 好 一 些 即 可 由 程 序 设 计 人 员 解 决 又 可 由 数 据 库 设 计 人 员 来 解 决 的 问 题, 保 证 数 据 完 整 性 就 是 一 个 这 样 的 问 题。

---- 笔 者 举 一 个 最 简 单 的 例 子: 货 物 出 库、 退 货 的 例 子

---- 这 里 有 库 存 表(kcb)、 出 库 单 表(ckb) 和 退 货 单 表(thb)

---- 库 存 表 包 含 如 下 列:WPBH,KCSL〔 物 品 编 号, 库 存 数 量〕

---- 出 库 单 表 含 如 下 列:WPBH,CKSL〔 物 品 编 号, 出 库 数 量〕

---- 退 货 单 表 含 如 下 列:WPBH,THSL〔 物 品 编 号, 退 货 数 量〕

---- 假 如 我 们 进 行 了 如 下 交 易:

---- 1 . 物 品A 有 十 件 出 库

---- 2 . 物 品A 有 五 件 退 货( 可 再 出 库)

---- 我 们 都 知 道, 这 两 笔 交 易 都 需 要 修 改 库 存 表, 但 修 改 库 存 表 的 工 作 由 谁 来 做。 可 以 肯 定 的 说, 程 序 设 计 人 员 和 数 据 库 设 计 人 员 都 可 以 完 成。

---- 首 先 我 们 举 例 由 程 序 设 计 人 员 如 何 完 成:

---- 1 . 出 库 时, 产 生 新 出 库 记 录 插 入 到 出 库 单 表 中, 同 时 将 库 存 表 中 的KCSL 用KCSL 减 掉 出 库 数 量 的 值 取 代。

---- 2 . 退 货 时, 产 生 新 退 货 记 录 插 入 到 退 货 表 中, 同 时 将 库 存 表 中 的KCSL 用KCSL 加 上 退 货 数 量 的 值 取 代。

---- 由 于 不 同 的 开 发 平 台, 完 成 这 项 工 作 的 代 码 不 尽 相 同, 故 不 写 出 具 体 代 码。

---- 接 下 来 看 看 由 数 据 库 设 计 人 员 是 如 何 完 成 这 项 工 作:

---- 数 据 库 设 计 人 员 完 成 这 项 工 作 靠 的 是 触 发 器。

---- 数 据 库 设 计 人 员 建 立 如 下SQL 语 句 为 出 库 单 表(ckb) 建 立 插 入 触 发 器

CREATE  TRIGGER  FORINSERT
ON   ckb
FOR  INSERT
AS
     UPDATE   kcb
         SET   kcb.kcsl=kcb.kcsl - inserted.cksl
         FROM  inserted
         WHERE  kcb.wpbh=inserted.wpbh

---- 同 样, 也 要 为 退 货 单 表 建 立 类 似 的SQL 语 句

    CREATE  TRIGGER  FORINSERT
ON   thb
FOR  INSERT
AS
     UPDATE   kcb
         SET   kcb.kcsl=kcb.kcsl + inserted.thsl
         FROM  inserted
         WHERE  kcb.wpbh=inserted.wpbh

---- 可 以 很 明 显 地 看 出, 如 果 两 个 人 都 做 了 工 作, 程 序 在 运 行 过 程 中 一 定 会 出 错。

---- 但 这 项 工 作 具 体 应 该 由 谁 来 完 成 ? 我 私 下 认 为, 应 该 由 数 据 库 设 计 人 员 来 完 成, 原 因 如 下:

---- 1、 一 个 可 移 植 性 好 的 软 件 应 该 与 数 据 的 结 构 无 关;

---- 2、 程 序 的 研 制 和 调 试 更 加 简 单, 再 拿 上 例 来 说, 程 序 设 计 人 员 只 需 完 成 往 出 库 单 表 和 退 货 单 表 中 插 入 相 应 的 记 录 工 作 即 可, 具 体 修 改 工 作 由 触 发 器 来 完 成。

---- 3、 触 发 器 的 运 行 是 在 服 务 器 端, 减 轻 了 客 户 端 的 开 销。

---- 4、 触 发 器 不 管 你 在 什 么 时 候 进 行 操 作, 它 都 会 启 动, 保 证 数 据 不 会 出 错。

---- 其 实, 上 文 所 写 的 触 发 器 只 是 一 个 最 简 单 的 例 子, 在 实 际 工 作 中 要 远 远 比 这 复 杂 得 多, 设 计 一 个 好 的 数 据 库 会 花 费 数 据 库 设 计 人 员 很 大 的 心 血, 如 果 只 是 建 立 了 表 格, 工 作 还 没 有 完 成 一 半 呢, 下 一 多 半 工 作 就 是 将 你 的 数 据 完 整 性 问 题 解 决 掉。

---- 成 功 地 设 计 一 个 数 据 库 能 起 到 事 半 功 倍 的 效 果。 数 据 的 完 整 性 已 经 解 决 了, 程 序 设 计 起 来 还 有 什 么 问 题 呢 ?

---- 说 来 容 易, 做 到 却 很 难, 比 者 在 实 际 工 作 中 也 经 常 遇 到 很 多 问 题, 希 望 能 和 众 多 的 同 行 共 同 进 步, 把 你 的 经 验 和 好 的 方 法 告 诉 大 家。

论坛徽章:
0
49 [报告]
发表于 2003-12-15 13:04 |只看该作者
读书笔记------得到数据库期望的性能

---摘自《ChinaASP网络》
读书笔记------得到数据库期望的性能

我读书的笔记,拿出来大家没事看看,或者,也是求证于大家之意
以MS sql server 6.5 为例

硬件调整性能
最有可能影响性能的是磁盘,解决办法
1.采用带高速缓冲的RAID阵列磁盘,
2.多I/O通道,多处理器超前读线程      可以提高检索两到三倍
3.较大高速缓冲,使用DBCC PRINTABLE 强制访问频率高的表常驻缓存

软件方法
1.规范化----------加快吞吐速度
2.反规范化-------加快检索速度
3.创建或删除索引
4.分割一个表后放入多个数据库
-----注.好象在7.0中这样没必要做,因为7.0中可以用多个文件存储数据库,然后将其分布到RAID磁盘中去提高响应速度

硬件放法能往往普遍提高性能,而软件方法只能提高某项,几项性能

对与数据库来说,常常会提到三个指标
1.查询的响应速度
2.吞吐量
3.并行处理能力
4.吞吐量和并行处理的结合

DBA工作的一项就是,设法在各个指标中折衷,取得用户满意的指标

最常见的是平衡update 和,select的性能
一般而言,规范化可以提高update性能,反规范化提高select性能

一个特殊的例子,平衡OLTP和DSS的性能
OLTP:联机事务处理程序,大多数数据操作为update,规范化数据库,小容量表,少量精简索引可以提高最佳性能
DSS:   数据仓库系统,对应这些系统,大多是查询操作,高冗余,多索引会提高响应速度

顺便说一下,在SQLserver 7.0中,用 query analyzer 可以很方便分析查询效率
当你的查询响应时间小于一秒时,你恐怕就得注意提高查询速度了

论坛徽章:
0
50 [报告]
发表于 2003-12-15 13:05 |只看该作者
Microsoft SQL Server 7.0 备份及恢复相关问题

---摘自《ASP动网先锋》
【「Microsoft SQL Server 7.0」以下简称「SQL Server 7.0」】SQL Server 6.5的SQL语句能否转储(Dump)和加载(Load)SQL server 7.0?可以进行备份(Backup)和恢复(Restore)。恢复数据库时出现下列信息如何解决?SQL-DMO Error: Could not obtain exclusive lock on database Model
这是因为恢复数据库时,另外一个程序正在使用模型数据库, 请在恢复数据之前先以sp_who这个存储过程查看是否有人在使用模型数据库。

在Windows 95/98下SQL Server 7.0是否可以备份到磁带中?

不行,请将数据库备份到磁盘驱动器再由备份到磁带。

在Windows 95/98下您也可以执行如\" EXEC sp_addumpdevice \'tape\', \'tapedump1\', \'\\\\.\\tape0\'\"的指令,但是当您执行\"backup database to tapedump1\"时会出现如下的信息:Server: Msg 3201, Level 16, State 5, Line 1 Cannot open backup device \'tapedump1\'. Device error or device off-line. See the SQL Server error log for more details. Server: Msg 3013, Level 16, State 1, Line 1 Backup or restore operation terminating abnormally.

并且在SQL Server 7.0 errorlog也会出现如下信息: BackupTapeFile::OpenMedia: Backup device \'\\\\.\\tape0\' failed to open. Operating system error = 2(The system cannot find the file specified.).

将SQL Server 7.0数据库备份到网络上时出现如下信息
Server: Msg 3201, Level 16, State 1, Line 1 Cannot open backup device \'E:\\pubs.dat\'. Device error or device off-line. See the SQL Server error log for more details. Server: Msg 3013, Level 16, State 1, Line 1 Backup or restore operation terminating abnormally.
并且在Error log出现
1998-12-29 11:58:21.62 kernel BackupDiskFile::CreateMedia: Backup device\'E:\\pubs.dat\' failed to create. Operating system error = 5(Access is denied.).
如何解决?

这是由于权限不够造成的。 请确定SQL Server Service的帐号为域用户(Domain User),并且在网络上写权限。

是否可以将SQL Server 7.0数据库备份到压缩卷(Compressed Volume)?

可以的,但是不建议如此做,如果要将数据库备份到压缩卷,请在备份之前和恢复之后执行DBCC。

将发布的数据库的备份恢复到一台没有做复制的SQL Server 7.0中导致事务日志标示为副本(replication),如何解决?

可以参照下列两种方法:

可能的话,备份发布的数据库之前先将其取消发布。
恢复之前,在目标数据库中设置发布。
什么是差异备份(differential backup)?

差异备份是SQL Server 7.0提供的新功能,差异备份只记录上次完全备份之后所做的变化。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP