社区
PowerBuilder
帖子详情
怎样在Install shield或PB 里直接把数据库附加到SQLSERVER中???急~!!
xiaomi603
2003-05-19 10:36:54
怎样在Install shield或PB 里直接把数据库附加到SQLSERVER中???急~!!
...全文
54
3
打赏
收藏
怎样在Install shield或PB 里直接把数据库附加到SQLSERVER中???急~!!
怎样在Install shield或PB 里直接把数据库附加到SQLSERVER中???急~!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
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 联机帮助中有所有上面提到的语句,不会可以看看联机帮助——简体中文的。我这里给你了基本的思路和语句,你可以自行发挥,有些地方可以换种方式实现。尤其有几个语句已经有新版本了,我这里是两三年前的代码,但可以不用替换,都是兼容的。
时间有限,随便写了一些,希望对大家有所帮助。
WEB开发文档2 总结
http://blog.donews.com/lvjiyong/archive/2006/06/29/931071.aspx 怎样将后台生成的在内存
中
的图象显示到客户端 Microsoft IE WebControls下载地址 如何在DATAGRID
中
使用JAVASCRIPT脚本控制 DataGrid
中
连接到...
【Vista之家编译】Windows Vista兼容软件列表大全!!
一、在Windows Vista下面完全兼容的软件: Academic 学术类 * MathWorks MatLab 2006a (32-bit) Vista之家备注:MATLAB是矩阵实验室(Matrix Laboratory)之意。除具备卓越的数值计算能力外,它还提供了...
认识VF--Visual FoxPro 漫谈
Remote View与SPT技术是由Visual FoxPro数据处理引擎
直接
支持的,这与在VB、VC++
中
的外部数据访问技术不同(他们使用组件,如:DAO、RDO、ADO……),所以用Visual FoxPro访问远程数据的效率很高,并能把远程数据与...
delphi控件使用
问题:如何动态地添加数据,把它很好地运用到自己的程序
中
来? F1book控件(Excel工作表控件) 拖入控件,双击行、列标题可以修改行列标题,右击work designer可以设置属性,其
中
gernal标签下的...
III 26 ELK
ELK(elasticsearch、logsta
sh
、kibana) Elastic Stack是原ELK Stack在5.0版本加入Beats套件后的新称呼 解决痛点: 开发人员不能登录线上server查看详细日志;...一个调用会涉及多个系统,难以在这些系统的日志
中
...
PowerBuilder
1,079
社区成员
66,439
社区内容
发帖
与我相关
我的任务
PowerBuilder
PowerBuilder 相关问题讨论
复制链接
扫一扫
分享
社区描述
PowerBuilder 相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章