怎样在Install shield或PB 里直接把数据库附加到SQLSERVER中???急~!!

xiaomi603 2003-05-19 10:36:54
怎样在Install shield或PB 里直接把数据库附加到SQLSERVER中???急~!!
...全文
37 点赞 收藏 3
写回复
3 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
喝醉的咖啡 2003-05-19
楼上说的符合楼主字面要求,不知道是不是楼主需要的?

sp_attach_db
将数据库附加到服务器。
注意哦:只应对以前使用显式 sp_detach_db 操作从数据库服务器分离的数据库执行 sp_attach_db。

呵呵,这指的是对一个数据库的物理存储的文件进行拆分和“还原”,前提是该库已经存在,且表和数据类型、数据验证等一致。我说的是用于安装到其它服务器上的“备份”/“还原”,或者在安装程序中“创建库”。
回复
andyzq 2003-05-19
在pb里调用系统存储过程sp_attach_db即可

//附加数据库
SQLCA.AutoCommit = true

string ls_path, ls_name, ls_database_path, ls_mdf_name, ls_ldf_name
long ll_return

ls_path = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Currentversion\Uninstall\Microsoft SQL Server 2000"
RegistryGet(ls_path, "InstallLocation", RegString!, ls_name)
ls_database_path = ls_name + "\data\"
ls_mdf_name = ls_database_path + 'enterprise_Data.MDF'
ls_ldf_name = ls_database_path + 'enterprise_Log.LDF'


DECLARE up_add_database PROCEDURE FOR sp_attach_db
@dbname = 'enterprise',
@filename1 = :ls_mdf_name,
@filename2 = :ls_ldf_name;
EXECUTE up_add_database;
close up_add_database;
commit;
回复
喝醉的咖啡 2003-05-19

引入数据库方法:
1、假如安装了SQLServer或者客户端工具,就可以用命令行 osql 命令,用 osql /? 查询帮助,或者看看联机帮助,大概的语法如下:osql -U login id -P password -d databasename -Q "cmdline query"
这里可以用osql执行 restore database 来还原数据库——注意:备份数据库的时候要把相关的loginid去掉,restore之后用osql调用存储过程重建即可。如果不去掉,restore的时候需要做很多判断和操作,比较麻烦。
因此,你可以在 InstallShield 中用 LaunchAppAndWait 来执行 osql;
2、写一个COM,或者VBScript(.vbs),在 InstallShield 中调用来实现上面过程;
3、用pb写一段程序专门来进行这个操作,在InstallShield的脚本 function OnFirstUIAfter() 中(即安装过程执行完毕)调用其实现导入数据库。

对于以上方法,要说明程序中如何“引入”数据库——还原数据库。由于我不懂pb,可以简单说一下过程(主要是 sqlserver 存储过程调用)。
1、制作数据库——备份数据库成为一个文件,备份前去掉该库相关的 login id,使其没有任何账号和权限可以访问;
2、用提供的 loginid 和 password 连接指定的 serverip,或者你用odbc等等;
3、注意,该 loginid 必须是 sa 或者相应权限的数据库,因此首先用其创建一个空库——注意判断重名。

先把当前库转为 master,
"USE master"

判断该库是否已经存在
"IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'" & gDataBaseName & "') DROP DATABASE [" & gDataBaseName & "]"
如果存在,则 drop(或者提示)

创建空库:
"CREATE DATABASE " & gDataBaseName & " ON ( NAME = " & gDataBaseName & "_dat, FILENAME = '" & strDBFilename & "', SIZE = 4, MAXSIZE = 10, FILEGROWTH = 1 ) LOG ON ( NAME = " & gDataBaseName & "_log, FILENAME = '" & strDBLogFilename & "', SIZE = 4, MAXSIZE = 10, FILEGROWTH = 1 ) COLLATE Chinese_PRC_CI_AS"
这里面需要注意生成的库文件和日志文件放到哪里,库的初始大小和增长情况等等;

3、用指定的库文件还原该库:
"Restore database " & gDataBaseName & " from Disk='" & strDBBackupFilename & "' with move '" & gDataBaseName & "_data' to '" & strDBFilename & "', move '" & gDataBaseName & "_log' to '" & strDBLogFilename & "'"
同样注意:生成的库文件和日志文件放到哪里,库的初始大小和增长情况等等。因为备份环境与安装环境的差异,备份文件中已经记录了这些信息,因此这里需要强制指明。
4、创建 login id 和 相应的权限
要弄清楚 sqlserver 的安全机制,有 loginid 才能“连接”数据库服务器,该 id 具备了对特定数据库的特定权限,才能“访问”该“(逻辑)数据库”。因为备份库的时候可能已经记录了login id等等,因此才要求前期准备工作中删掉这些信息。

下面的操作是对上面这一要求没有做到的“预防”措施
"if exists( select name from " & gDataBaseName & ".dbo.sysusers where name='" & gDataBaseAdmin & "') select 1 else select 2"
判断对该库是否存在指定 loginid 的访问权——即该逻辑库的username,根据返回1或者2得到结果
如果存在,可以用 "sp_dropuser '" & gDataBaseAdmin & "'" 删除该 loginid
这里也可以对所有对该库的关联账号一律删掉。

"if exists( select name from master.dbo.syslogins where name='" & gDataBaseAdmin & "') select 1 else select 2"
这一步根据结果使用"sp_droplogin '" & gDataBaseAdmin & "'"删除相关 login id
5、最后使用
"sp_addlogin '" & gDataBaseAdmin & "','" & gDataBasePassWord & "','" & gDataBaseName & "'"
创建 login id,并关联到该数据库作为默认库。
然后使用 sp_adduser 设置该 login id 对 该库的数据库访问权限。

ok,完毕。

这些内容,完全可以写成一个 sql 文件,然后用程序读入来执行。
或者写成一个存储过程,然后由程序,或osql读入数据库,然后调用执行。
这两种方法,前者需要用程序读取到的变量替换sql文件中的数据库名字等,后者需要传递足够的参数给存储过程。

最后,如果你的目的不是“把数据库附加到SQLSERVER中”,而是创建一个空库,那最简单就是在sqlserver中对现有库“生成SQL”,另存为一个文件,然后再用程序或者osql创建该库。
其中注意的是,osql读入sql文件批量执行多个sql语句,必须分段来写,每句之间加入一句 go 来告诉 sqlserver 分开执行,不能连续执行。

呵呵,如果你不熟悉 SQLServer别再问下去了,SQLServer 联机帮助中有所有上面提到的语句,不会可以看看联机帮助——简体中文的。我这里给你了基本的思路和语句,你可以自行发挥,有些地方可以换种方式实现。尤其有几个语句已经有新版本了,我这里是两三年前的代码,但可以不用替换,都是兼容的。

时间有限,随便写了一些,希望对大家有所帮助。
回复
相关推荐
发帖
PowerBuilder
创建于2007-09-28

892

社区成员

PowerBuilder 相关问题讨论
申请成为版主
帖子事件
创建了帖子
2003-05-19 10:36
社区公告
暂无公告