佳盟首页 透视佳盟 新闻动态 移动商务 公司产品 典型用户 解决方案 佳盟服务 渠道联盟 关联企业
帐 号:
密 码:
 
  当前位置:首页 >佳盟服务
   佳盟服务
  SQL备份和Server 触发器

  为什么我不能把我的SQL Server数据库备份/存储到网络上?

  答:原因是MSSQLSERVER服务与NT credentials是分开运行的。不管你以什么身份登陆,SQL都可以工作。因此你的登陆帐号与任何映射驱动器是无关的。是SQL Server在做备份而不是你。同样,通过SQL      Executive/SQL Agent做备份就是把TSQL传送到SQL Server去运行,所以这仍然是MSSQLSERVER在做备份/存储。
因此备份GUI不显示你的影射驱动器也不允许输入UNC路径。你必须使用原始TSQL命令来做备份。
MSSQLSERVER使用的默认NT credentials设置是本地系统帐号。你可以在控制面板/服务的高亮度的MSSQLSERVER上选择开始来检查MSSQLSERVER运行在什么USERID下。
   本地系统帐号不能共享网络存取,因为它不是经过认证的网络帐号。
   所以,如果你想把数据库备份到一个可共享的网络上,有两种选择:
   1 改变运行MSSQLSERVER服务的帐号为具有相关网络权限的用户帐号。
   2 修改目的服务器的     HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\NullSessionShares注册值并添加你想导出到的共享文件名称-这个共享不能认证谁来访问。在改变生效之前目的服务器上的服务器服务必须重新启动。注意这次操作因为共享而失去了安全性,所以你要小心什么是可以共享的。 不管你使用哪种方法,都必须使用UNC名来标识文件而不是一个驱动器字母。
例如(6.5)把数据库PUBS导出到DISK='\\server01\share\backupdir\backup.dmp'
(7.0)把数据库PUBS备份到DISK='\\server01\share\backupdir\backup.dmp'

  把拷贝过的SQL Server 7数据库恢复的正确方法.

  在SQL Server 7中由于MS重新设计了数据库文件的存储方式,取消了新建设备再建数据库这一繁琐的过程。新的存储格式,一个数据库包括两个文件,mdf数据库文件和ldf日志文件。所以我们在重装机器备份时可以把你要备份的数据库的这两个文件拷贝出来,重新安装之后再恢复。
   在SQL Server中提供了这种恢复方式的存储过程。
   1.sp_attach_db [@dbname =] 'dbname',[@filename1 =] 'filename_n'
给系统添加一个数据库,在dbname指定数据库名称,filename_n指定数据库的文件和日志文件。比如我有一个voogiya的库,停止SQL Server服务备份voogiya_data.mdf,voogiya_log.ldf,启动SQL server,删除掉这个库,然后再把这两上文件拷到sql server DATA目录中,在Query Analyzer中执行如下语句:
EXEC sp_attach_db @dbname = N'voogiya',
@filename1 = N'd:\mssql7\data\voogiya_data.mdf',
@filename2 = N'd:\mssql7\data\voogiya_log.ldf'
就会把这个库加入到SQL Server Group中.
2.sp_attach_single_file_db [@dbname =] 'dbname',
[@physname =] 'physical_name'
这个命令和上面的功能一样,在physical_name中只要写上据库的物理文件名就可以了,日志文件SQL server会重新建立。这个存储过程的运行要先执行下面的存储过程:
sp_detach_db @dbname = 'dbname'
同样以上面的为例:
EXEC sp_detach_db @dbname = 'voogiya'
EXEC sp_attach_single_file_db @dbname = 'voogiya',
@physname = 'd:\mssql7\data\voogiya_data.mdf'

  要注意执行以上存储过程的用户要在sysadmin中.

  以上方法在windows Nt 4.0,service pack5,sql server 7.0上运行通过。


   Server 触发器在U8 实施中的应用

  大家想像一下这样的需求,客户是一个经销各种药品的集团企业,总公司下设十几个分子公司,各分子公司独立核算盈亏(意味着要建十几套账),各分子公司与总公司同城,利用内部光纤相连,在总公司服务器上统一建账,要求:
   1)、各分子公司与总公司基础档案(如供应商、客户、存货分类、存货)保持实时一致(即在任何时候都要是一致的)。
   2)、总公司向各分子公司调拨药品,这类业务在该公司非常频繁,因此客户希望在总公司账套填制一张调拨单后,能够在对应的分子公司账套中自动生成一张调拨单。这样可以减轻他们很大的工作量。
一般来说,因为用友U8(包括8X系列和零户统管)目前尚没有类似功能,如果要实现这些需求,只有通过二次开发,具体方法各位见仁见智。在这里我想谈一下我的解决思路,由于自认为有一定代表性,所以不敢藏拙,贴出来搏各位大虾一笑。
   我们知道,用友U8系列管理软件由于选用了SQL Server (7.0或2000版本)作为后台处理数据库,使软件功能有了很大的提升,但同时因为SQL Server 数据库本身的复杂性,也给U8的实施带来了一定的困难。但是,我们如果能够熟练应用SQL Server 本身的许多特性的话,则会有一些意想不到的收获,甚至大大扩展U8的功能。
针对以上客户需求,我利用SQL Server中的触发器,针对第一个需求,解决方法如下:
如客户总公司账套号为001,分子公司账套号为002和003(由于十几套账和两套账的道理是一致的,这里只选择两套账),客户档案同步更新的SQL语句如下:
if exists(select name from sysobjects where type =‘tr‘ and name=‘customer_delete‘) --客户表删除
drop trigger customer_delete
go
create trigger customer_delete on customer for delete
as
delete from ufdata_002_2001..customer where ccuscode in (select ccuscode from deleted)
delete from ufdata_003_2001..customer where ccuscode in (select ccuscode from deleted)
go
if exists(select name from sysobjects where type =‘tr‘ and name=‘customer_insert‘) --客户表插入
drop trigger customer_insert
go
create trigger customer_insert on customer for insert
as
insert ufdata_002_2001..customer select * from inserted
insert ufdata_003_2001..customer select * from inserted
go

  以上语句在SQL Query Analyzer 中的Ufdata_001_2001数据库中执行之后,在001账套中任意增加或删除一个客户档案之后,002和003账套中的对应客户档案也被同步增加或删除,即基本达到了客户的要求。
其它基础档案的同步与以上类似:
   1、 客户分类,只需将以SQL语句中的所有Customer替换为customerclass,ccuscode替换为ccccode即可。
   2、 供应商分类,将customer替换为vendorclass,ccuscode替换为cvccode即可。
   3、 供应商档案,将customer替换为vendor,ccuscode替换为cvencode即可。

  可能有些对SQL不太熟悉的朋友对以上语句的机理不太了解,下面我就不嫌啰嗦,再解说一下:
先说一下触发器,触发器是一种实施复杂的完整性约束的特殊存储过程,当对它所保护的数据进行修改时自动激活,防止对数据进行不正确、未授权或不一致的修改。触发器又不像一般的存储过程,不能像一般存储过程一样通过存储过程的名字来调用或执行。而是当用户对指定的表进行修改(包括插入、删除或更新)时,SQL Server将自动执行在相应触发器中的SQL语句。
   讲解触发器,必须先讲一下触发器的两个专用表:inserted表和deleted表。这是两个逻辑表,由系统来维护,不允许用户直接对这两个表进行修改。它们存放于内存中,不存放在数据库中。这两个表的结构总是与被该触发器作用的表的结构相同。触发器工作完成后,与触发器相关的这两个表也会被删除。
   1、 inserted表:存放由于insert或update语句的执行而导致要加到该触发器作用的表中去的所有新行。即用于插入或更新的新行值,在插入或更新表的同时,也将其副本存入inserted表中。因此,在inserted表中的行总是与作用表中的新行相同。
   2、 deleted表:存放由于delete或update语句的执行而导致要加到该触发器作用的表中删除的所有行。也就是说,把被作用表中要删除或要更新的旧行移到deleted表中。因此,deleted表和被作用表不会有相同的行。
对INSERT操作,只在inserted表中保存所插入的新行,而deleted表中无数据。对于DELETE操作,只在deleted保存被删除的旧行,而inserted表中无数据。对于UPDATE操作,可以将它理解为DELETE操作和INSERT操作的结果,所以在inserted表中存放着更新后的新行值,deleted表中存放着更新前的旧行值。
明白了这些道理之后,我上面的代码想必也就不难理解了。

上海佳盟计算机系统有限公司 | ShangHai Best-Union Computer System CO,.LTD.
上海市浦东新区浦东大道1525号中国石化大厦西楼22层 邮编:200135
总机:400-060-1683 传真:021-68532023 沪ICP备17049617号-1