在VB中更改SQL Server數(shù)據(jù)庫(kù)結(jié)構(gòu)
發(fā)表時(shí)間:2024-02-23 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]筆者在開發(fā)"涼山州林業(yè)局"天然林資源保護(hù)綜合管理系統(tǒng)中,需要為程序建立Sql Server數(shù)據(jù)庫(kù)的運(yùn)行環(huán)境。為了方便用戶,筆者開發(fā)了這個(gè)數(shù)據(jù)庫(kù)配置工具。完成在SQL Server數(shù)據(jù)庫(kù)中建立設(shè)備,建立數(shù)據(jù)庫(kù),建立表格,分配權(quán)限的功能,"涼山州林業(yè)局"系統(tǒng)中的...
筆者在開發(fā)"涼山州林業(yè)局"天然林資源保護(hù)綜合管理系統(tǒng)中,需要為程序建立Sql Server數(shù)據(jù)庫(kù)的運(yùn)行環(huán)境。為了方便用戶,筆者開發(fā)了這個(gè)數(shù)據(jù)庫(kù)配置工具。完成在SQL Server數(shù)據(jù)庫(kù)中建立設(shè)備,建立數(shù)據(jù)庫(kù),建立表格,分配權(quán)限的功能,"涼山州林業(yè)局"系統(tǒng)中的所有數(shù)據(jù)庫(kù)配置操作都可以通過這個(gè)小工具完成。方便了數(shù)據(jù)庫(kù)應(yīng)用程序所需Sql Server環(huán)境的建立,根本不用啟動(dòng)SQL Enterprise Manager配置數(shù)據(jù)庫(kù)。
---- 這個(gè)小工具由VB開發(fā),利用ADO 訪問數(shù)據(jù)庫(kù),實(shí)現(xiàn)更改數(shù)據(jù)庫(kù)結(jié)構(gòu),其他語(yǔ)言也可以此作為參考。啟動(dòng)VB6.0,新建一個(gè)工程,在菜單-工程-引用里選"Microsoft ActiveX Data Objects 2.0 Library",代碼里需要有
dim conn As New ADODB.Connection
'定義ADO數(shù)據(jù)庫(kù)對(duì)象
conn.ConnectionString = "driver={SQL Server};" & _
"server=" & ServerName & ";uid=" & UserName & ";
pwd=" & Password & ";database=" & DatabaseName & ""
'連接數(shù)據(jù)串
conn.open '連接數(shù)據(jù)庫(kù)
---- 注:ServerName為服務(wù)器名;UserName為用戶名;Password為用戶口令; DatabaseName要登錄的數(shù)據(jù)庫(kù)名,可以為空。
---- 核心代碼如下:
一、建立數(shù)據(jù)庫(kù)
---- 原理:建立數(shù)據(jù)庫(kù)先要初始化一個(gè)數(shù)據(jù)庫(kù)設(shè)備,然后在此設(shè)備上建立數(shù)據(jù)庫(kù)。所有的設(shè)備名在系統(tǒng)表"sysdevices"里有記錄,所有的數(shù)據(jù)庫(kù)名在系統(tǒng)表"sysdatabases"里有記錄。在建立之前,最好先查詢這兩個(gè)系統(tǒng)表,看名稱是否已經(jīng)存在。在建立設(shè)備之前,還需要的一個(gè)物理名和空閑的設(shè)備標(biāo)識(shí)號(hào)。
初始化設(shè)備語(yǔ)法:
DISK INIT NAME="device_name",PHYNAME=
"physical_name",VDEVNO=device_number,
SIZE=numberofblock
---- 說明:這里,NAME是數(shù)據(jù)庫(kù)設(shè)備名(一個(gè)有效的標(biāo)識(shí)符),PHYNAME(數(shù)據(jù)庫(kù)設(shè)備的物理名)是原始的磁盤分區(qū)UNIX或外設(shè)(vms)名,或者是操作系統(tǒng)的文件名。VDEVNO時(shí)數(shù)據(jù)庫(kù)的設(shè)備標(biāo)識(shí)號(hào),合法值為1-255,SIZE的單位是2KB的塊,例如1MB(1024KB)時(shí)SIZE值為512。
---- 建立數(shù)據(jù)庫(kù)語(yǔ)法:CREATE DATABASE database_name [ON database_device]
---- 說明:database_name是要建的數(shù)據(jù)庫(kù)名,database_device是設(shè)備名
---- 要新建立一個(gè)數(shù)據(jù)庫(kù),就需要設(shè)備名,數(shù)據(jù)庫(kù)名,物理名和設(shè)備號(hào)。具體步驟如下:
---- 我們假設(shè)用戶要新建立設(shè)備dbName,在設(shè)備dbName上建立數(shù)據(jù)庫(kù)dbName。
---- 1)得到設(shè)備名。dbName是用戶給出的設(shè)備名;先查詢系統(tǒng)表sysdevices,看用戶給出的設(shè)備名dbName是否已經(jīng)存在,如果此設(shè)備名存在,就需要更換一個(gè)設(shè)備名,因?yàn)樵O(shè)備名是唯一的。
sql = "select * from sysdevices
where name='" & dbName & "'"
Set rs = conn.Execute(sql)
If Not rs.EOF Then
MsgBox "設(shè)備名"" & dbName & ""
已存在!", 16, "請(qǐng)重新輸入名稱"
Exit Sub
End If
---- 2)得到數(shù)據(jù)庫(kù)名。dbName是用戶給出的數(shù)據(jù)庫(kù)名;查詢系統(tǒng)表sysdatabases,看用戶給出的數(shù)據(jù)庫(kù)名dbName是否已經(jīng)存在,如果此數(shù)據(jù)庫(kù)存在,就需要更換一個(gè)數(shù)據(jù)庫(kù)名,像設(shè)備名一樣,數(shù)據(jù)庫(kù)名也是唯一的
sql = "select * from sysdatabases
where name='" & dbName & "'"
Set rs = conn.Execute(sql) '下面代碼略
---- 3)得到PHYNAME物理名。查詢服務(wù)器上數(shù)據(jù)庫(kù)文件的物理位置serverpath,典型的,我們可以從系統(tǒng)表sysdevices中查詢master(這是SQL Server的主庫(kù)名)數(shù)據(jù)庫(kù)的位置,例如G:\MSSQL\DATA\MASTER.DAT,則我們的數(shù)據(jù)庫(kù)可以建在"G:\MSSQL\DATA\"目錄下。
sql = "select name,phyname from sysdevices "
'low/16777216為設(shè)備號(hào)
Set rs = conn.Execute(sql)
然后遍歷記錄對(duì)象rs,當(dāng)name="master"時(shí),取出phyname,
從而可以得到物理位置serverpath =G:\MSSQL\DATA\。
---- 4)得到一個(gè)空閑的設(shè)備號(hào)vdevno。設(shè)備號(hào)合法值1~255,遍歷這些號(hào),查找出未被使用的空閑設(shè)備號(hào),下面程序得到已有的設(shè)備號(hào)
sql = "select distinct low/16777216
from sysdevices order by low/16777216"
'low/16777216為設(shè)備號(hào)
---- 5)建立數(shù)據(jù)庫(kù)。所需的信息都準(zhǔn)備完畢,可以建立數(shù)據(jù)庫(kù)了(注:下面的"" & Chr(34) & ""就是一個(gè)"""雙引號(hào),這樣處理后,才能滿足語(yǔ)法要求;數(shù)據(jù)庫(kù)為20M,則dbSize=512*20)
sql = "DISK INIT NAME=" & Chr(34) & ""
& dbName & "" & Chr(34) & ",PHYSNAME="
& Chr(34) & "" & serverpath & "" & dbName
& ".dat" & Chr(34) & ",VDEVNO=" & vdevno
& ",SIZE=" & dbSize & ""
Set rs = conn.Execute(sql) '初始化設(shè)備
sql = "CREATE DATABASE " & dbName & "
on " & dbName & "=" & dbSize & ""
'注:
第一個(gè)dbName是數(shù)據(jù)庫(kù)名,
第二個(gè)dbName是設(shè)備名
Set rs = conn.Execute(sql)'
在設(shè)備dbName上建立數(shù)據(jù)庫(kù)dbName
MsgBox "數(shù)據(jù)庫(kù)"" & dbName & ""建在服務(wù)器上
"" & serverpath & "" & dbName & ".dat",
建立成功!", 64, "成功"
二、建立表格
---- 建立表格比較簡(jiǎn)單,這里用到了自動(dòng)計(jì)數(shù)字段和缺省值字段類型,語(yǔ)法如下:
CREATE TABLE table_name
(field_name data_type [NOT NULL NULL],…)
---- 說明:table_name為新建的表名,field_name為字段名,data_type為數(shù)據(jù)類型。
(注意下面的fileid int IDENTITY字段自動(dòng)計(jì)數(shù),
datetime NOT NULL DEFAULT(GETDATE())字段每當(dāng)入
庫(kù)時(shí)有個(gè)缺省值,由數(shù)據(jù)庫(kù)生成當(dāng)時(shí)的時(shí)間)。
sql = "CREATE TABLE " & TableName & "
(fileid int IDENTITY, filetime datetime NOT
NULL DEFAULT(GETDATE()),fileimage image NULL )"
conn.Execute sql '建立表格
三、建立用戶組用戶
---- 建立用戶組和用戶不能直接通過SQL語(yǔ)句完成,需要執(zhí)行SQL Server的存儲(chǔ)過程sp_addlogin,sp_addgroup, sp_adduser。我們假設(shè)新建登錄賬號(hào)是username1,用戶名是username1,組名是group1,則步驟如下:
---- 1)建立用戶的登錄賬號(hào)
語(yǔ)法:sp_addlogin login_name,password[,defdb]
其中,login_name是用戶的登錄名,password是用
戶的口令,defdb上登錄的缺省數(shù)據(jù)庫(kù)名稱。建立數(shù)
據(jù)庫(kù)DatabaseName的登錄賬號(hào):
sql = "EXECUTE sp_addlogin " & username1 & ","
& password1 & "," & DatabaseName & ""
Set rs = conn.Execute(sql)
---- 2)增加用戶組
語(yǔ)法:sp_addgroup group_name
其中,group_name 是新建組名
sql = "EXECUTE sp_addgroup " & group1 & ""
Set rs = conn.Execute(sql)
---- 3)增加用戶
語(yǔ)法:sp_adduser login_name
[,name_in_db[,grpname]]
其中,login_name用戶名,name_in_db是用戶在當(dāng)
前數(shù)據(jù)庫(kù)中的名字(這里是第一步建立的登錄賬號(hào)
username1),grpname是要將用戶加入的那個(gè)組的組名。
在數(shù)據(jù)庫(kù)DatabaseName增加用戶username1:
sql = "EXECUTE sp_adduser " & username1 & "," &
username1 & "," & group1& ""
'注:第一個(gè)username1是用戶名,第二個(gè)username1是
數(shù)據(jù)庫(kù)DatabaseName的登錄賬號(hào)
Set rs = conn.Execute(sql)
四、分配權(quán)限
---- 語(yǔ)法:grant permission_list on object_name to who
---- 其中,permission_list是所要分配的權(quán)限清單,object_name是在這個(gè)對(duì)象上的權(quán)限,who是接受授權(quán)的用戶。
---- 涼山州林業(yè)局"系統(tǒng)需要將特殊用戶建立的表授權(quán)給其他用戶,所以先從系統(tǒng)表sysobjects得到所有的用戶建立表格名(type='U')
sql = "select name from sysobjects where type='U'"
Set rs = conn.Execute(sql)
---- 然后從中選取所需要的表格來分配權(quán)限給其他用戶。例如,這里選擇將tablename3的讀取權(quán)限分配給組group1。
sql = "grant select on " & tablename3 &
" to " & group1 & ""
conn.Execute sql
---- 由于這個(gè)小工具的使用,使SQL Server數(shù)據(jù)庫(kù)配置變得簡(jiǎn)單、方便了。