SQL-DMO y SQL-NS

You might also like

Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 23

In a world where data must be available 24 hours a day, 7 days a week, database

administrators (DBAs) are in demand. It is not always possible to sta data operation !enters
with ully"#ualiied $%& DBAs. 'his !hapter shows you how to !onstru!t su!h a tool usin(
$%& Database )ana(ement *b+e!ts ($%&"D)*) and $%& ,amespa!e ($%&",$) ob+e!ts
with )i!rosot- .isual Basi!-.
$%&"D)* and $%&",$ are /*) intera!es you !an a!!ess rom .isual Basi! or any other
/*)"speakin( lan(ua(e. $%&"D)* is a !olle!tion o ob+e!ts that en!apsulate $%& $erver0s
database, s!hedulin(, and repli!ation mana(ement. $%&",$ is a !olle!tion o ob+e!ts,
a!!essed sli(htly dierently, that en!apsulate the un!tionality in $%& $erver 1nterprise
)ana(er.
*ne advanta(e o passin( $%& $erver mana(ement tasks throu(h a /*) intera!e is the
e2tra layer o prote!tion it provides. 3or e2ample, i several people in your or(ani4ation need
remote $%& $erver administrative !apability, but you want to maintain spe!ii! !ontrol o
what they !an do or a!!ess ater they are inside the system, $%&"D)* !an provide a
solution. 'his !hapter demonstrates a sample .isual Basi! appli!ation, the $%& 5unior
Administrator, that provides administrative !apability without (rantin( total a!!ess.
As mentioned, $%&"D)* e2poses $%& $erver as a series o ob+e!ts in !olle!tions. 'he
Application ob+e!t !ontains all the $%& $erver ob+e!ts, ea!h o whi!h !ontains a !olle!tion
o Database ob+e!ts. 1a!h Database ob+e!t holds a (roup o !olle!tions, su!h as Tables,
ea!h o whi!h is made up o a series o ob+e!ts, su!h as Column ob+e!ts, ea!h o whi!h has
a series o properties. 'here are dierent buildin( blo!ks or ea!h o the !olle!tions but they
share the same (eneral ar!hite!ture. $%&"D)* allows pro(rammati! a!!ess to every layer.
6sin( $%&"D)* and $%&",$, you !an perorm almost any administrative or mana(ement
task throu(h simple dot notation !odin(. 'he ma+or dieren!e between $%&"D)* and $%&"
,$ is in the way they allow a!!ess to the server ob+e!ts. $%&"D)* uses a !olle!tion o
!olle!tions, and $%&",$ uses a tree"and"node model. Althou(h you !an manipulate $%&
$erver throu(h either one, most o this !hapter will o!us on $%&"D)*. 3or more
inormation about $%&"D)* and $%&",$, see $%& $erver Books *nline.
'he sample appli!ation dis!ussed in this !hapter uses only a ew o the ways that you !an
manipulate a $%& $erver database usin( $%&"D)*. In a!t, almost every property o every
ob+e!t in the database !an be manipulated in!ludin( lo(ins, inde2es, relationships, orei(n
keys, and tri((ers.
Inside the SQL Junior Administrator Application

'he $%& 5unior Administrator sample appli!ation is provided on the a!!ompanyin( /D. 'he
!ode is immediately usable, and it !an be easily modiied or up(raded or more se!ure or
thorou(h un!tionality.
6ser Intera!e

'he appli!ation provides a simple (raphi!al user intera!e, throu(h whi!h users !an lo( in,
view e2istin( data ob+e!ts, !reate new data ob+e!ts, and a!!ess a subset o the $%& $erver
tools.
Log In

*pen $%&D)*.e2e on the a!!ompanyin( /D. 'he drop"down bo2 displays any $%& $erver
instan!es available on your network or lo!al !omputer and allows or lo(in.
Note 'his sample appli!ation !ontains only basi! error handlin( un!tionality.
Setting Permissions

$u!!essul lo(in brin(s you to the main s!reen. 7ou !an !reate and view server lo(ins
without sele!tin( a database, but i you want to perorm database"spe!ii! a!tions involvin(
tables or stored pro!edures, you must sele!t a database.
'o !reate a lo(in, on the Create menu !li!k Login.
Ater you enter the lo(in inormation, a list bo2 appears, displayin( the names o the
databases ound on that server instan!e. 'o add user permissions to an individual database,
sele!t the database in that list and then !onirm the !hoi!e in the dialo( bo2 that appears.
'he appli!ation automati!ally adds DB8DD&AD)I, and DB8DA'A9:I'1: permissions to
the !hosen database. 'hese permissions allow users to !reate and modiy new tables as
well as view and edit data in e2istin( tables.
'o view e2istin( lo(ins, !li!k Logins on the View menu. 'o delete a lo(in, sele!t it in the list
bo2, and then !onirm your !hoi!e.
Viewing Existing Data Objects

Ater the user has been (iven the !orre!t permissions, e2istin( tables and stored pro!edures
within that database are available throu(h the View menu. 'he stored pro!edures
themselves !annot be modiied, but the !olumns within a !hosen table !an be seen and
added to (althou(h the properties o e2istin( ields !annot be !han(ed rom this appli!ation).
3or e2ample, to view e2istin( data ob+e!ts, !li!k Table on the View menu.
Ater you sele!t a table, two buttons appear, oerin( a !hoi!e to add a new !olumn or to view
e2istin( !olumns. /li!kin( A Column !auses several ields to appear on the orm in whi!h
the basi! properties o a new !olumn !an be set. (*nly the properties re#uired or the
!reation o a new !olumn are present here, thou(h every !olumn property !an be set
pro(rammati!ally.) 'o !reate the new !olumn, set the property values and then !li!k A
Column. /li!kin( View Columns produ!es a list bo2 showin( all available !olumns. Ater
you sele!t a !olumn, ields appear, !ontainin( the e2istin( !olumn properties.
Note It is not possible to modiy e2istin( !olumn properties usin( this appli!ation.
Creating New Data Objects

7ou !an also !reate new data ob+e!ts rom this intera!e. 3or e2ample, to !reate a new table
in a database, !li!k Table on the Create menu and then ill in the orm ields. Ater you enter
the name or the new table, you !an use the !ontrols that appear to enter property
inormation or new !olumns. ('he TableName!ID !olumn, whi!h is an ID !olumn, is !reated
automati!ally.)
"sing S#L Ser$er Tools

'he Application tab provides a!!ess to the administrative un!tionality, su!h as wi4ards
and ba!kup, you !an use throu(h $%&"D)*.
'he list bo2 on the let shows all e2istin( lo(s in that instan!e o $%& $erver, the list bo2 on
the ri(ht shows all e2istin( ba!kup devi!es, and the C%ange S#LSer$ers button opens the
main orm and allows you to lo( into a dierent $%& $erver database.
'his orm only allows you to view e2istin( ob+e!ts, su!h as ba!kup devi!es. I you want to
add un!tionality to !reate new ob+e!ts, ollow this sample appli!ation0s model or !reatin(
tables and !olumns. 7ou +ust need to provide the !ode to set or a!!ess the !orre!t properties
within the appropriate !olle!tion. $%&"D)* does the rest.
,ote that rmApp provides a hi(her level o a!!ess than other parts o this appli!ation. 'he
D& 'i(ars button allows dire!t a!!ess to the $%& $erver 1nterprise )ana(er wi4ards.
'hese wi4ards allow the user to implement a wide variety o administrative tasks. /li!kin(
this button opens the master wi4ard, rom whi!h any o the other wi4ards !an be sele!ted
and put into a!tion. 'he ull un!tionality o these wi4ards is too e2tensive to be !overed here,
but it in!ludes all o the individual pro!esses shown on rmApp. 3or more inormation about
the $%& $erver 1nterprise )ana(er wi4ards, see $%& $erver Books *nline
Note 'he $%& $erver 1nterprise )ana(er wi4ards are a!!essed throu(h $%&",$, not
$%&"D)*. 3or more inormation, see ;Appli!ation 'asks< in this !hapter.
.isual Basi! /ode

By e2plorin( the !ode behind the user intera!e, you !an learn more about usin( $%&"D)*
and $%&",$ to implement !ustom .isual Basi! solutions. 'his se!tion ollows the path a
user mi(ht ollow, startin( with lo(in and pro(ressin( throu(h dierent tasks. =ere is the
!ode behind the irst lo(in s!reen>
Private Sub Form_Load()
On Error GoTo ErrorHandler

Dim SQL7 As e! SQLD"O#A$$li%ation
Dim ameList As SQLD"O#ameList

Set ameList & SQL7#ListAvailableSQLServers
' S(o! all available servers runnin) SQL Server
Dim * As +nte)er
For * & , To ameList#-ount
"e#lstSrvrs#Add+tem ameList(*)
e*t
' -lean u$
Set SQL+nstan%e & ot(in)
Set ameList & ot(in)

E*it Sub

ErrorHandler.
"s)/o* 01nable to )et list o2 servers#0
End Sub
'his subroutine uses the ListA$ailableS#LSer$ers method o the Application ob+e!t to
populate the NameList D)* ob+e!t when the orm loads. 'he NameList ob+e!t is a
!olle!tion ob+e!t, whi!h the !ode iterates throu(h to produ!e a list bo2 that !ontains all the
instan!es o $%& $erver that are available to that !omputer.
'he ollowin( subroutine re!ords the user"entered inormation and attempts to lo( in to the
sele!ted instan!e o $%& $erver throu(h the Connect property o the instan!e. 1a!h
re#uired layer o the $%&"D)* nest must be instantiated.
Private Sub btnGo_-li%3()
On Error GoTo ErrorHandler

' Set a$$li%ation variables 2or lo)in
Dim SQL7 As e! SQLD"O#A$$li%ation
Dim SQL+nstan%e As SQLD"O#SQLServer
Set SQL+nstan%e & e! SQLD"O#SQLServer
' Lo) in
SQL+nstan%e#-onne%t "e#lstSrvrs#Te*t4 "e#t*tLo)in#Te*t4
"e#t*tPass!ord#Te*t

' +2 O5 t(en
Set SQL+nstan%e & ot(in)
Set SQL7 & ot(in)
' Set )lobal variables
Serverame & "e#lstSrvrs#Te*t
1ser & "e#t*tLo)in#Te*t
Pass!ord & "e#t*tPass!ord#Te*t
' O$en t(e bod6 o2 t(e $ro)ram
Load 2rm"ain
"e#Hide
2rm"ain#S(o!

-all HideOt(ers(02rm"ain0)

E*it Sub
ErrorHandler.
"s)/o* 01nable to lo) 6ou in to 0 7 Serverame 7 0#0
End Sub
'he inal, one"line subroutine sets the !ursor into the lo(in bo2 automati!ally ater a $%&
$erver instan!e is sele!ted>
Private Sub lstSrvrs_-li%3()
"e#t*tLo)in#SetFo%us
End Sub
Note ?lobal variables, as set in the btn?o8/li!k subroutine ater the su!!essul lo(in, are
rarely the best way to store user inormation. *n the other hand, the (lobal module may be
the pere!t pla!e to initiali4e appli!ation and server instan!es, whi!h are re#uired or every
task in $%&"D)*, althou(h those initiali4ations are in!luded in every subroutine here. 'his
parti!ular appli!ation has been written to be immediately usable and at the same time easily
modiied or up(raded or more se!ure or thorou(h un!tionality.
'he )ieOt%ers un!tion !alled rom the btn?o8/li!k subroutine !an be ound in the (lobal
module. It takes the name o one orm (the one the user has sele!ted to see) as a parameter
and hides the rest, with the e2!eption o the )DI parent orm in whi!h most o the appli!ation
windows live>
Publi% Sub HideOt(ers(/68al Formame As Strin))
Dim Form As Form
For Ea%( Form +n Forms

+2 Form#ame 9: Formame And Form#ame 9: 02rm"D+"ain0
T(en Form#Hide

e*t
End Sub
*ain

'he )DI parent (rm)DI)ain) opens ater su!!essul lo(in, and it initially !ontains the )ain
orm (rm)ain) with the database list bo2 dis!ussed earlier in this !hapter. 'he )DI orm has
some !ode behind it, but it only reers to the menu !ontrols present on the orm, su!h as the
On!Loa event that disables some o them initially>
Private Sub "D+Form_Load()
"e#%mdTable#Enabled & False
"e#%md8ie!Table#Enabled & False
"e#%md8ie!SP#Enabled & False
mnuA$$#Enabled & False
End Sub
'he same menu provides basi! pro(ram un!tionality, su!h as e2itin( the appli!ation>
Private Sub %md-lose_-li%3()
'E*it t(e $ro)ram
Dim Form As Form
For Ea%( Form +n Forms
1nload "e
e*t
End Sub
'he ollowin( !ode provides one e2ample o pro(ram navi(ation, !oded similarly throu(hout
the appli!ation (only the menu !hoi!e name and the orm name !han(e)>
Private Sub %md8ie!Table_-li%3()
Load 2rm8ie!Table
2rm8ie!Table#S(o!

-all HideOt(ers(02rm8ie!Table0)
End Sub
'he )ain orm is strai(htorward. 'he two read"only te2t bo2es display the server name and
ConnectionID value, whi!h is the value $%&"D)* uses to atta!h you to the !orre!t $%&
$erver instan!e. A list bo2 shows ea!h o the databases on that $%& $erver in mu!h the
same way as the S#LSer$ers !olle!tion was (enerated on the lo(in s!reen.
'he only thin( your !ode must do is instantiate a $%&"D)* ob+e!t or ea!h layer o the nest
you want to a!!ess. In this !ase, the user will a!!ess one layer deeper than rom the lo(in
s!reen@ the list bo2 here will show the databases inside the previously sele!ted server
instan!e.
Note 'he base inde2 value or !olle!tions in $%&"D)* is A instead o B (whi!h is the usual
inde2 value o the irst ob+e!t in a .isual Basi! !olle!tion or array). Be!ause o this, any
!ounter variables must be initiali4ed.
Publi% Sub GetD/List()
'T(is subroutine retrieves a list o2 databases
't(at reside on t(e server s$e%i2ied b6 name
'in t(e -onne%t $ro$ert6 o2 t(e instan%e o2 SQL
Server
On Error GoTo ErrorHandler

' -reate a SQL;D"O a$$li%ation and SQL Server <,,,
instan%e
Dim SQL<,,, As e! SQLD"O#A$$li%ation
Dim SQL+nstan%e As SQLD"O#SQLServer
Dim D/ As SQLD"O#Database
' +nstan%e variables
Dim SQLSrvr+D As Lon)

Set SQL+nstan%e & e! SQLD"O#SQLServer
' -onne%t to t(e server b6 name (2rom )lobal variable)
SQL+nstan%e#-onne%t Serverame4 1ser4 Pass!ord
' Set t(e instan%e to t(at server +D
SQLSrvr+D & SQL+nstan%e#-onne%tion+D
Set SQL+nstan%e & SQL<,,,#SQLServers#+tem/6+D(SQLSrvr+D)

' Dis$la6 t(e available databases in a list bo*
Dim * As +nte)er

* & =

For Ea%( D/ +n SQL+nstan%e#Databases

'Do not add s6stem databases to t(e list
+2 ot SQL+nstan%e#Databases(*)#S6stemOb>e%t T(en
"e#lstD/s#Add+tem (SQL+nstan%e#Databases(*)#ame)
End +2

* & * ? =

e*t

' S(o! t(e %onne%tion +D
"e#t*t-n*n+D & SQLSrvr+D

' -lean u$
Set SQL+nstan%e & ot(in)
Set SQL<,,, & ot(in)

E*it Sub

ErrorHandler.
"s)/o* 01nable to )et database list#0
End Sub
'he ConnectionID value is also the value re#uired to e2e!ute the Item&+ID method o the
S#LSer$ers !olle!tion in the Application ob+e!t>
SQLSrvr+D & SQL+nstan%e#-onne%tion+D
Set SQL+nstan%e & SQL<,,,#SQLServers#+tem/6+D(SQLSrvr+D)
'hese two lines assure !onne!tion to the instan!e o $%& $erver while you work with the
database ob+e!ts inside.
In the 3or 1a!h loop that produ!es the list bo2 o databases, take note o this line>
+2 ot SQL+nstan%e#Databases(*)#S6stemOb>e%t T(en
'he S+stemObject property (whi!h holds a Boolean value) o ea!h database within the
Databases !olle!tion allows you to display only the available non"system databases. 'his is
an e2ample o the additional se!urity that $%&"D)* !an provide while still allowin( some
administrative tasks on the server to be a!!omplished.
'he inal subroutine in the orm enables the balan!e o those tasks ater a database has
been sele!ted>
Private Sub lstD/s_-li%3()

2rm"D+"ain#%mdTable#Enabled & True
2rm"D+"ain#%md8ie!Table#Enabled & True
2rm"D+"ain#%md8ie!SP#Enabled & True
2rm"D+"ain#mnuA$$#Enabled & True
End Sub
Create Login

Addin( permissions or someone to work within that instan!e o $%& $erver is a two"step
pro!ess. In this appli!ation, both pro!esses are taken !are o in the same orm
(rm/reate&o(in). 'he irst step is to !reate a lo(in to the server itsel. 'o do this, add a
Login to the Logins !olle!tion o the server instan!e and then assi(n the !orre!t server
permissions to that lo(in>
Private Sub -reateLo)in(/68al e!Lo)in+D As Strin)4 /68al
e!Pass!ord As Strin))
On Error GoTo ErrorHandler
Dim SQL<,,, As e! SQLD"O#A$$li%ation
Dim SQL+nstan%e As SQLD"O#SQLServer
Dim SQLSrvr+D As Lon)
Dim Lo)in As SQLD"O#Lo)in

' 1ser ob>e%ts
Dim e!Lo)in As SQLD"O#Lo)in
Dim Server@ole As SQLD"O#Server@ole
Dim Server@ole< As SQLD"O#Server@ole

Set SQL+nstan%e & e! SQLD"O#SQLServer
' -onne%t to t(e server b6 name (2rom )lobal variables)
SQL+nstan%e#-onne%t Serverame4 1ser4 Pass!ord
SQLSrvr+D & -Ln)(2rm"ain#t*t-n*n+D)
Set SQL+nstan%e & SQL<,,,#SQLServers#+tem/6+D(SQLSrvr+D)

' -reate t(e lo)in
Set e!Lo)in & -reateOb>e%t(0SQLD"O#Lo)in0)
' Server roles 2or t(e lo)in
Set Server@ole & SQL+nstan%e#Server@oles(0db%reator0)
Set Server@ole< & SQL+nstan%e#Server@oles(0dis3admin0)
A -(e%3 to see i2 t(at lo)in alread6 e*ists
Dim * As +nte)er
For Ea%( Lo)in +n SQL+nstan%e#Lo)ins
+2 Lo)in#ame & e!Lo)in+D T(en
"s)/o* 0T(at lo)in alread6 e*ists in 0 7 Serverame 7
0#0
E*it Sub
End +2
e*t

' +2 not t(en assi)n lo)in values
e!Lo)in#T6$e & SQLD"OLo)in_Standard
e!Lo)in#SetPass!ord 004 e!Pass!ord
e!Lo)in#ame & e!Lo)in+D

' Add t(e ne! lo)in to t(e %orre%t roles
SQL+nstan%e#Lo)ins#Add e!Lo)in
Server@ole#Add"ember (e!Lo)in+D)
Server@ole<#Add"ember (e!Lo)in+D)

"s)/o* 0e! lo)in added to 0 7 Serverame 7 0#0
' S(o! database user 2ields
"e#lblD/#8isible & True
"e#lstD/s#8isible & True
E*it Sub

' -lean u$
Set SQL+nstan%e & ot(in)
Set SQL<,,, & ot(in)
Set Server@ole & ot(in)
Set Server@ole< & ot(in)
Set Lo)in & ot(in)
Set e!Lo)in & ot(in)
E*it Sub
ErrorHandler.
"s)/o* 01nable to add lo)in su%%ess2ull6#0
End Sub
Ater all o the ob+e!ts and variables have been initiali4ed, the lo(in is !he!ked a(ainst all o
the e2istin( lo(ins in the Logins !olle!tion usin( this !ode>
Dim * As +nte)er
For Ea%( Lo)in +n SQL+nstan%e#Lo)ins
+2 Lo)in#ame & e!Lo)in+D T(en
"s)/o* 0T(at lo)in alread6 e*ists in 0 7 Serverame 7
0#0
E*it Sub
End +2
e*t
'hen the Login ob+e!t itsel is !reated and assi(ned values or the re#uired properties>
Set e!Lo)in & -reateOb>e%t(0SQLD"O#Lo)in0)
e!Lo)in#T6$e & SQLD"OLo)in_Standard
e!Lo)in#SetPass!ord 004 e!Pass!ord
e!Lo)in#ame & e!Lo)in+D
'he irst ar(ument !ontains an empty strin( be!ause there is no previous password or this
lo(in. 7ou !an also use the SetPasswor method to !han(e e2istin( passwords.
Cermissions must also be set or new lo(ins. In $%& $erver, permissions are oten (ranted
throu(h server roles. 'he $%& 5unior Administrator appli!ation !reates two server roles,
DB/:1A'*: and DI$DAD)I,>
Set Server@ole & SQL+nstan%e#Server@oles(0db%reator0)
Set Server@ole< & SQL+nstan%e#Server@oles(0dis3admin0)
Ser$er,oles is a !olle!tion !ontained in ea!h $%& $erver instan!e. 3or more inormation
about se!urity, see /hapter AB, ;Implementin( $e!urity,< and $%& $erver Books *nline.
Ater the roles are !reated, use the ollowin( !ode to add the new lo(in to members o the
Logins !olle!tion o the server instan!e>

SQL+nstan%e#Lo)ins#Add e!Lo)in
Server@ole#Add"ember (e!Lo)in+D)
Server@ole<#Add"ember (e!Lo)in+D)
,e2t, (rant users a!!ess to individual databases. /reatin( these permissions is similar to
addin( lo(ins to a server instan!e. Instead o addin( a lo(in to the Logins !olle!tion o the
server instan!e, add a user to the "sers !olle!tion o ea!h database and assi(n that user
the appropriate database roles>
Private Sub -reateD/1ser(/68al D/ame As Strin)4 /68al e!Lo)in+D As
Strin)4 /68al e!Pass!ord As Strin))
On Error GoTo ErrorHandler

Dim SQL<,,, As e! SQLD"O#A$$li%ation
Dim SQL+nstan%e As SQLD"O#SQLServer
Dim SQLSrvr+D As Lon)
Dim D/ As SQLD"O#Database

' 1ser ob>e%ts
Dim D/1ser As SQLD"O#1ser
Dim @ole As SQLD"O#Database@ole
Dim @ole< As SQLD"O#Database@ole

Set SQL+nstan%e & e! SQLD"O#SQLServer
' -onne%t to t(e server b6 name (2rom )lobal variables)
SQL+nstan%e#-onne%t Serverame4 1ser4 Pass!ord
SQLSrvr+D & -Ln)(2rm"ain#t*t-n*n+D)
Set SQL+nstan%e & SQL<,,,#SQLServers#+tem/6+D(SQLSrvr+D)
' Add t(e lo)in as a user to t(e database
' !it( t(e a$$ro$riate $ermissions
Set D/1ser & -reateOb>e%t(0SQLD"O#1ser0)
D/1ser#ame & e!Lo)in+D
D/1ser#Lo)in & e!Pass!ord

Set D/ & SQL+nstan%e#Databases(D/ame)
Set @ole & D/#Database@oles(0D/_DDLAD"+0)
Set @ole< & D/#Database@oles(0D/_DATAB@+TE@0)

D/#1sers#Add D/1ser
@ole#Add"ember e!Lo)in+D
@ole<#Add"ember e!Lo)in+D

"s)/o* 0e! user $ermissions to %reate database ob>e%ts and to
read and !rite data 0 7 vb-rL2 _
7 0(ave been added to 0 7 D/ame 7 0#0

' -lean u$
Set SQL+nstan%e & ot(in)
Set SQL<,,, & ot(in)
Set D/ & ot(in)
Set D/1ser & ot(in)
Set @ole & ot(in)
Set @ole< & ot(in)
E*it Sub
ErrorHandler.
"s)/o* 01nable to add database user#0

End Sub
'he newly !reated lo(in now has permissions in the sele!ted databases to !reate and
modiy tables and to read and write data.
Create Table

/reatin( a table is similar to !reatin( a user@ both are ob+e!ts (and members o !olle!tions)
within a database. *nly the !olle!tion reeren!es and re#uired property settin(s !han(e.
Private Sub AddTable(/68al D/ame As Strin)4 /68al Tableame As
Strin))
On Error GoTo ErrorHandler

Dim SQL<,,, As e! SQLD"O#A$$li%ation
Dim SQL+nstan%e As SQLD"O#SQLServer
Dim -n*n+D
' Database ob>e%ts
Dim D/ As SQLD"O#Database
' Table ob>e%ts
Dim e!Table As SQLD"O#Table
Dim e!-olumn As SQLD"O#-olumn

Set SQL+nstan%e & e! SQLD"O#SQLServer
' -onne%t to t(e server b6 name (2rom )lobal variable)
SQL+nstan%e#-onne%t Serverame4 1ser4 Pass!ord
-n*n+D & 2rm"ain#t*t-n*n+D
Set SQL+nstan%e & SQL<,,,#SQLServers#+tem/6+D(-n*n+D)

' -reate table and %olumn
Set e!Table & -reateOb>e%t(0SQLD"O#Table0)
Set e!-olumn & -reateOb>e%t(0SQLD"O#-olumn0)

' ame t(e table and )ive o!ners(i$ to t(e dbo
e!Table#ame & Tableame
e!Table#O!ner & 0dbo0

' Add t(e 2irst %olumn as identit6 ;
' at least one %olumn must be $resent be2ore 6ou add a table
e!-olumn#ame & Tableame 7 0_+D0
e!-olumn#Datat6$e & 0int0
e!-olumn#+dentit6 & True
e!-olumn#+dentit6Seed & ,
e!-olumn#+dentit6+n%rement & =

'Add it to t(e -olumns %olle%tion
e!Table#-olumns#Add e!-olumn

'Add t(e !(ole t(in) to t(e Tables %olle%tion
Set D/ & SQL+nstan%e#Databases(D/ame)
D/#tables#Add e!Table

"s)/o* 0table added to 0 7 D/ame
' S(o! t(e %olumn %ontrols
"e#lblAdd-olumns#8isible & True
"e#lbl-olame#8isible & True
"e#lblDataT6$e#8isible & True
"e#lblOr#8isible & True
"e#lblDe2ault#8isible & True
"e#lblulls#8isible & True
"e#lblLen)t(#8isible & True

"e#t*t-olame#8isible & True
"e#lstDT#8isible & True
"e#%(3ulls#8isible & True
"e#t*tDe2ault#8isible & True
"e#t*tLen)t(#8isible & True
"e#btn-reate-olumn#8isible & True
E*it Sub

ErrorHandler.
"s)/o* 01nable to add table#0
End Sub
Note 'he previous subroutine !ontains !ode to make !ertain !ontrols appear only ater the
table !reation pro!ess has a!tually be(un. 'his is not re#uired@ it is there to keep the orm
un!luttered.
'he only dieren!e between !reatin( a table ob+e!t and !reatin( a user ob+e!t is the addition
o the irst Column ob+e!t in the table. 'his is re#uired by the A method o the Tables
!olle!tion. 'he previous !ode deines the irst !olumn it !reates as an identity !olumn. (*nly
one identity !olumn is allowed in ea!h table.)
e!-olumn#ame & Tableame 7 0_+D0
e!-olumn#Datat6$e & 0int0
e!-olumn#+dentit6 & True
e!-olumn#+dentit6Seed & ,
e!-olumn#+dentit6+n%rement & =
'he ollowin( line o !ode sets the owner o the table>
e!Table#O!ner & 0dbo0
=ere, ownership ri(hts have been (iven to the database owner. I your !ode does not do
this, the Owner property o the ob+e!t is automati!ally mapped to the !urrent lo(in. 'his !an
!reate problems i you try to remove that lo(in rom the system.
'o add !olumns, a!!ess the Columns !olle!tion in the table and add a !olumn to it>
Private Sub Add-olumn(/68al D/ame As Strin)4 /68al Tableame As
Strin)4 /68al -olumname As Strin))
On Error GoTo ErrorHandler

Dim SQL<,,, As e! SQLD"O#A$$li%ation
Dim SQL+nstan%e As SQLD"O#SQLServer
Dim -n*n+D As Lon)
' Database ob>e%t
Dim D/ As SQLD"O#Database
' Table ob>e%ts
Dim table As SQLD"O#table
Dim e!-olumn As SQLD"O#-olumn

Set SQL+nstan%e & e! SQLD"O#SQLServer
' -onne%t to t(e server b6 name (2rom )lobal variable)
SQL+nstan%e#-onne%t Serverame4 1ser4 Pass!ord
-n*n+D & -Ln)(2rm"ain#t*t-n*n+D)
Set SQL+nstan%e & SQL<,,,#SQLServers#+tem/6+D(-n*n+D)
Set D/ & SQL+nstan%e#Databases(D/ame)

' Get t(e table
Set table & D/#Tables(Tableame)
' -reate t(e %olumn
Set e!-olumn & -reateOb>e%t(0SQLD"O#-olumn0)

' Add t(e %olumn !it( basi% $ro$erties
e!-olumn#ame & -olumname
e!-olumn#Datat6$e & "e#lstDT#Te*t
e!-olumn#Len)t( & "e#t*tLen)t(#Te*t
+2 "e#%(3ulls#8alue & = T(en e!-olumn#Allo!ulls & True
e!-olumn#De2ault & "e#t*tDe2ault#Te*t

'Add it to t(e -olumns %olle%tion
table#-olumns#Add e!-olumn
"s)/o* 0-olumn 0 7 -olumname 7 0 added to 0 7 Tableame 7 0#0

' @eset t(e 2orm
"e#t*t-olame & 00
"e#t*tDe2ault & 00
"e#t*tLen)t( & 00
"e#%(3ulls#8alue & ,
"e#t*t-olame#SetFo%us

E*it Sub

ErrorHandler.
"s)/o* 01nable to add %olumn#0
End Sub
As shown in the two previous subroutines, !ertain properties o the !olumn must be set or
the A method o the Columns !olle!tion to work. 3or e2ample, the Datat+pe property
must be set, so that all o the e2istin( data types are listed in a list bo2 on rm/reate'able. 'o
do this, loop throu(h ea!h member o the S+stemDataT+pes !olle!tion o the database
(usin( a variant to hold ea!h value).
Private Sub GetDataT6$es()

On Error GoTo ErrorHandler
Dim SQL<,,, As e! SQLD"O#A$$li%ation
Dim SQL+nstan%e As SQLD"O#SQLServer
Dim -n*n+D
' Database ob>e%ts

Dim D/ As SQLD"O#Database
Dim D/ame As Strin)

Set SQL+nstan%e & e! SQLD"O#SQLServer
' -onne%t to t(e server b6 name
SQL+nstan%e#-onne%t Serverame4 1ser4 Pass!ord
-n*n+D & 2rm"ain#t*t-n*n+D
Set SQL+nstan%e & SQL<,,,#SQLServers#+tem/6+D(-n*n+D)

' Get t(e database b6 name
D/ame & 2rm"ain#lstD/s#Te*t
Set D/ & SQL+nstan%e#Databases(D/ame)

Dim dt
Dim * As +nte)er

* & =

For Ea%( dt +n D/#S6stemDatat6$es

"e#lstDT#Add+tem D/#S6stemDatat6$es#+tem(*)#ame
* & * ? =

e*t

' -lean u$
Set D/ & ot(in)
Set SQL+nstan%e & ot(in)
Set SQL<,,, & ot(in)
E*it Sub

ErrorHandler.
"s)/o* 01nable to )et list o2 data t6$es#0

End Sub
'his appli!ation sets only the properties re#uired to make the !alled method work !orre!tly.
=owever, you !an use $%&"D)* to manipulate all !olumn properties, +ust as i you were
within $%& $erver 1nterprise )ana(er.
Note 7ou do not have to memori4e all o the properties and methods, be!ause the standard
dot notation statement !ompletion works with $%&"D)*. 9hen you dot any !orre!tly
instantiated ob+e!t, a list o available properties and methods appears.
View Table

:etrievin( the e2istin( !olumns or any tables in the database is a simple two"step pro!ess
that be(ins with iteratin( throu(h the Tables !olle!tion added to in the previous e2ample. In
the ?et'able&ist subroutine shown here, the results o the loop are a(ain pla!ed in a list bo2>
Private Sub GetTableList(/68al SQLSrvr+D As Lon)4 /68al D/ame As
Strin))
' A$$li%ation ob>e%ts
Dim SQL<,,, As e! SQLD"O#A$$li%ation
Dim SQL+nstan%e As SQLD"O#SQLServer
' Database ob>e%t
Dim D/ As SQLD"O#Database
' Table and %olumn ob>e%ts
Dim table As SQLD"O#Table
Dim e!-olumn As SQLD"O#-olumn

Set SQL+nstan%e & e! SQLD"O#SQLServer
' -onne%t to t(e server b6 name (2rom )lobal variable)
SQL+nstan%e#-onne%t Serverame4 1ser4 Pass!ord
Set SQL+nstan%e & SQL<,,,#SQLServers#+tem/6+D(SQLSrvr+D)
Set D/ & SQL+nstan%e#Databases(D/ame)

' S(o! t(e tables one at a time
Dim * As +nte)er
For * & = To D/#Tables#-ount
' /ut do not s(o! s6stem tables
+2 ot D/#Tables(*)#S6stemOb>e%t T(en
"e#lstTables#Add+tem D/#Tables(*)#ame
End +2
* & * ? =
e*t
End Sub
'he se!ond part o the operation, the listin( o the !olumns themselves, !an be !ompleted
ater the table has been sele!ted>
Private Sub GetFieldList(/68al SQLSrvr+D As Lon)4 /68al D/ame As
Strin)4 /68al Tableame As Strin))
' A$$li%ation ob>e%ts
Dim SQL<,,, As e! SQLD"O#A$$li%ation
Dim SQL+nstan%e As SQLD"O#SQLServer
' Database ob>e%t
Dim D/ As SQLD"O#Database
' Table and %olumn ob>e%ts
Dim table As SQLD"O#table
Dim -olumn As SQLD"O#-olumn

Set SQL+nstan%e & e! SQLD"O#SQLServer
' -onne%t to t(e server b6 name (2rom )lobal variable)
SQL+nstan%e#-onne%t Serverame4 1ser4 Pass!ord
Set SQL+nstan%e & SQL<,,,#SQLServers#+tem/6+D(SQLSrvr+D)
Set D/ & SQL+nstan%e#Databases(D/ame)
Set table & D/#Tables(Tableame)

' S(o! t(e %olumns one at a time
Dim * As +nte)er

* & =
For * & = To table#-olumns#-ount
"e#lstFields#Add+tem table#-olumns(*)#ame
* & * ? =
e*t
End Sub
In this appli!ation, the !apability to add a !olumn to an e2istin( table is present in the same
orm (rm.iew'able).
View Login

'he pro!ess or seein( e2istin( lo(ins or a server is similar to the pro!ess or seein(
databases on the server. 'o view e2istin( lo(ins, use the Logins !olle!tion. ('his is the same
!olle!tion used to add a new lo(in and to loop throu(h to see i a lo(in already e2ists by
a!!essin( the Name property.) 'he ollowin( !ode adds lo(ins to a list bo2>
Sub GetLo)ins(/68al SQLSrvr+D As Lon))
On Error GoTo ErrorHandler

Dim SQL<,,, As e! SQLD"O#A$$li%ation
Dim SQL+nstan%e As SQLD"O#SQLServer
' 1ser ob>e%ts
Dim Lo)in As SQLD"O#Lo)in

Set SQL+nstan%e & e! SQLD"O#SQLServer
' -onne%t to t(e server b6 name (2rom )lobal variable)
SQL+nstan%e#-onne%t Serverame4 1ser4 Pass!ord
Set SQL+nstan%e & SQL<,,,#SQLServers#+tem/6+D(SQLSrvr+D)

' Fill t(e list bo*
Dim *
* & =
For Ea%( Lo)in +n SQL+nstan%e#Lo)ins
"e#lstLo)ins#Add+tem SQL+nstan%e#Lo)ins(*)#ame
* & * ? =
e*t
' -lean u$
Set SQL+nstan%e & ot(in)
Set SQL<,,, & ot(in)
E*it Sub

ErrorHandler.
"s)/o* 01nable to )et lo)in list#0
End Sub
A !ommon reason or retrievin( a list o lo(ins is so you !an delete someone0s lo(in. 'his is a
two"step pro!ess that is the reverse o addin( a lo(in. 7ou must remove the lo(in as a user
rom all appropriate databases beore you remove it as a server lo(in. 7ou !an a!!omplish
this in one pro!edure, usin( the ,emo$e method o the "sers and Logins !olle!tions>
Sub DeleteLo)in(/68al SQLSrvr+D As Lon)4 /68al Lo)in As Strin))
On Error GoTo ErrorHandler
Dim SQL<,,, As e! SQLD"O#A$$li%ation
Dim SQL+nstan%e As SQLD"O#SQLServer
Dim D/ As SQLD"O#Database

Set SQL+nstan%e & e! SQLD"O#SQLServer
' -onne%t to t(e server b6 name (2rom )lobal
variable)
SQL+nstan%e#-onne%t Serverame4 1ser4 Pass!ord
Set SQL+nstan%e & SQL<,,,#SQLServers#+tem/6+D(SQLSrvr+D)

' @emove t(e user 2rom all databases
For Ea%( D/ +n SQL+nstan%e#Databases
+2 D/#+s1ser(Lo)in) T(en D/#1sers#@emove (Lo)in)
e*t

' @emove t(e user 2rom t(e server
SQL+nstan%e#Lo)ins#@emove (Lo)in)

' S(o! %on2irmation
"s)/o* Lo)in 7 0 (as been removed 2rom 0 7 Serverame

' Fill t(e list bo* a)ain
Dim * As +nte)er
* & =
Dim 1serame As SQLD"O#Lo)in

"e#lstLo)ins#-lear
For Ea%( 1serame +n SQL+nstan%e#Lo)ins
"e#lstLo)ins#Add+tem SQL+nstan%e#Lo)ins(*)#ame
* & * ? =
e*t

' -lean u$
Set 1serame & ot(in)
Set SQL+nstan%e & ot(in)
Set SQL<,,, & ot(in)
Set D/ & ot(in)
E*it Sub
ErrorHandler.
"s)/o* 01nable to delete lo)in#0
End Sub
'he Is"ser method removes the user rom the "sers !olle!tion in only the appropriate
databases in the Database ob+e!t>
For Ea%( D/ +n SQL+nstan%e#Databases
+2 D/#+s1ser(Lo)in) T(en D/#1sers#@emove (Lo)in)
e*t
3ailin( to use this method results in an error or any database i the !hosen lo(in is not
!urrently shown as a member o that database0s "sers !olle!tion. 'he previous pro!edure
also automati!ally reills the lo(ins list bo2 on!e the lo(in is removed rom the system.
/han(in( permissions or an e2istin( lo(in or user re#uires only sli(ht modii!ation o the
previous pro!edures.
View Store Proceures

'he viewin( o stored pro!edures is un!tionality added to the $%& 5unior Administrator with
.isual Basi! and A!tive $erver Ca(es (A$C) developers in mind. 7ou must usually know the
e2a!t names o the stored pro!edures you want to e2e!ute pro(rammati!ally. ?ettin( all o
the e2istin( stored pro!edures in a database by name and displayin( them !onveniently is
easy in $%&"D)*>
Private Sub GetSPList(/68al SQLSrvr+D As Lon)4 /68al D/ame As
Strin))
On Error GoTo ErrorHandler
' A$$li%ation ob>e%ts
Dim SQL<,,, As e! SQLD"O#A$$li%ation
Dim SQL+nstan%e As SQLD"O#SQLServer
' database ob>e%t
Dim D/ As SQLD"O#Database

Set SQL+nstan%e & e! SQLD"O#SQLServer
' -onne%t to t(e server b6 name (2rom )lobal variable)
SQL+nstan%e#-onne%t Serverame4 1ser4 Pass!ord
Set SQL+nstan%e & SQL<,,,#SQLServers#+tem/6+D(SQLSrvr+D)
Set D/ & SQL+nstan%e#Databases(D/ame)

' S(o! t(e stored $ro%edures one at a time
Dim * As +nte)er
For * & = To D/#StoredPro%edures#-ount
"e#lstSPs#Add+tem D/#StoredPro%edures(*)#ame
e*t
Set SQL<,,, & ot(in)
Set SQL+nstan%e & ot(in)
Set D/ & ot(in)
E*it Sub

ErrorHandler.

"s)/o* 01nable to retrieve stored $ro%edures#0

End Sub
Note Be!ause $%& synta2 !he!kin( is not provided, you !annot use this appli!ation to view
and edit the a!tual $%& !ode within the stored pro!edure.
Application Tas-s

7ou !an be(in to e2plore the ull un!tionality o $%&"D)* by usin( this sample appli!ation
to retrieve (but not modiy) two other !olle!tions in $%& $erver. 'hese !olle!tions, &ac-up
De$ices an Database Logs, are (eared more dire!tly toward a!tual administrative tasks
and represent only a small subset o the a!!essible !olle!tions.
7ou !an use similar !ode to !omplete both retrieval tasks. 'his !ode shows how to retrieve
the lo(s>
Sub GetLo)s(/68al SQLSrvr+D As Lon)4 /68al D/ame As Strin))
' A$$li%ation ob>e%ts
Dim SQL7 As e! SQLD"O#A$$li%ation
Dim SQL+nstan%e As SQLD"O#SQLServer
' Database ob>e%t
Dim D/ As SQLD"O#Database

Set SQL+nstan%e & e! SQLD"O#SQLServer
' -onne%t to t(e server b6 name (2rom )lobal variable)
SQL+nstan%e#-onne%t Serverame4 1ser4 Pass!ord
Set SQL+nstan%e & SQL7#SQLServers#+tem/6+D(SQLSrvr+D)
Set D/ & SQL+nstan%e#Databases(D/ame)

' S(o! t(e lo) 2iles one at a time
Dim * As +nte)er
For * & = To D/#Transa%tionLo)#Lo)Files#-ount
"e#lstLo)#Add+tem D/#Transa%tionLo)#Lo)Files(*)#ame
* & * ? =
e*t
' -lean u$
Set D/ & ot(in)
Set SQL+nstan%e & ot(in)
Set SQL7 & ot(in)
End Sub
'his !ode shows how to retrieve the list o ba!kup devi!es>
Sub Get/a%3u$Dv%s(/68al SQLSrvr+D As Lon))
' A$$li%ation ob>e%ts
Dim SQL7 As e! SQLD"O#A$$li%ation
Dim SQL+nstan%e As SQLD"O#SQLServer
' Database ob>e%t
Dim D/ As SQLD"O#Database

Set SQL+nstan%e & e! SQLD"O#SQLServer
' -onne%t to t(e server b6 name (2rom )lobal variable)
SQL+nstan%e#-onne%t Serverame4 1ser4 Pass!ord
Set SQL+nstan%e & SQL7#SQLServers#+tem/6+D(SQLSrvr+D)
Dim * As +nte)er
+2 SQL+nstan%e#/a%3u$Devi%es#-ount & , T(en
"e#lst/1Dv%#Add+tem 0o /a%3u$ Devi%es0

Else
' S(o! t(e lo) 2iles one at a time
For * & = To SQL+nstan%e#/a%3u$Devi%es#-ount
"e#lst/1Dv%#Add+tem SQL+nstan%e#/a%3u$Devi%es(*)#ame
* & * ? =
e*t

End +2

' -lean u$
Set D/ & ot(in)
Set SQL+nstan%e & ot(in)
Set SQL7 & ot(in)

End Sub
7ou will probably use $%&"D)* to !onstru!t appli!ations to oer only limited !apability to
mana(e administrative tasks in $%& $erver. =owever, i you want to oer a more robust
intera!e to $%& $erver, $%&",$ may be the better solution. Althou(h the overall !apabilities
o $%&"D)* and $%&",$ are similar, $%&",$ allows you to a!!ess the $%& $erver
1nterprise )ana(er wi4ards. 'he $%& $erver 1nterprise )ana(er wi4ards provideremote
administrative !apabilities.
'he D& 'i(ars button invokes $%&",$ to !all the various wi4ards in $%& $erver
1nterprise )ana(er. 7ou !an use $%&",$ to allow ull remote administrative a!!ess to the
database. 1very wi4ard is a!!essible throu(h this simple pie!e o !ode>
Private Sub GetBiC()
Dim S As SQLS#SQLames$a%e
Dim SO As SQLS#SQLames$a%eOb>e%t
Dim Srvr As Lon)
Dim str-n*n As 8ariant


Set S & -reateOb>e%t(0SQLS#SQLames$a%e0)

str-n*n & Strin)(<DD4 ,)
str-n*n & 0Server&0
str-n*n & str-n*n 7 Serverame 7 0E0
str-n*n & str-n*n 7 01+D&0 7 1ser 7 0E0
str-n*n & str-n*n 7 0$!d&0 7 Pass!ord 7 0E0

"s)/o* 0Four %onne%tion strin) is.0 7 vb-rL2 7 str-n*n
S#+nitialiCe 0SQLD"O04 SQLS@ootT6$e_Server4 str-n*n4
2rm"D+"ain#(Bnd
Srvr & S#Get@oot+tem
+2 Srvr 9: , T(en
Set SO & S#GetSQLames$a%eOb>e%t(Srvr)
SO#E*e%ute-ommand/6+D (SQLS_-md+D_B+GA@DS)
Else
"s)/o* 0o server0
End +2
End Sub
9hen you use $%&",$, ob+e!ts are instantiated to !reate a node"and"tree ob+e!t stru!ture
(as opposed to !olle!tions as in $%&"D)*)>
Dim S As SQLS#SQLames$a%e
Dim SO As SQLS#SQLames$a%eOb>e%t
/onne!tions are also !reated dierently, althou(h the server name, user ID, and password
are all still re#uired. 3or e2ample, a spe!ii! !ast is re#uired instead o simple strin( variable
!reation beore the !onne!tion strin( is assembled.
Dim str-n*n As 8ariant
str-n*n & Strin)(<DD4 ,)
str-n*n & 0Server&0
str-n*n & str-n*n 7 Serverame 7 0E0
str-n*n & str-n*n 7 01+D&0 7 1ser 7 0E0
str-n*n & str-n*n 7 0$!d&0 7 Pass!ord 7 0E0
'he !onne!tion is then established throu(h the Initiali(ation property (not the Connect
property) o the NameSpace ob+e!t>
S#+nitialiCe 0SQLD"O04 SQLS@ootT6$e_Server4 str-n*n4
2rm"D+"ain#(Bnd
In the previous line o !ode, the irst ar(ument is the re#uestin( appli!ation, the se!ond is the
root type, the third is the !onne!tion strin(, and the last is the handle o the re#uestin( )DI
orm within the appli!ation that was passed in the irst parameter.
3inally, ob+e!t reeren!es are also dierent in $%&",$ and $%&"D)*. In $%&",$, server
ob+e!ts are a!!essed throu(h the appropriate root node>
Srvr & S#Get@oot+tem
+2 Srvr 9: , T(en
Set SO & S#GetSQLames$a%eOb>e%t(Srvr)
SO#E*e%ute-ommand/6+D (SQLS_-md+D_B+GA@DS)
Else
"s)/o* 0o server0
End +2
'his is the line o !ode that retrieves the wi4ard>
SO#E*e%ute-ommand/6+D (SQLS_-md+D_B+GA@DS)
In this !ase, the !onstant that shows all o the other wi4ards ($%&,$8/mdID89IEA:D$)
was sele!ted, but ea!h o the ollowin( wi4ards is available by passin( the appropriate
/ommandID !onstant.

Comman Constant
/reate Database 9i4ard $%&,$8/mdID89IEA:D8/:1A'1DB
/reate Inde2 9i4ard $%&,$8/mdID89IEA:D8/:1A'1I,D1F
Data ImportG12port 9i4ard $%&,$8/mdID89IEA:D8D'$I)C*:'
Data ImportG12port 9i4ard $%&,$8/mdID89IEA:D8D'$1FC*:'
/reate 5ob 9i4ard $%&,$8/mdID89IEA:D8/:1A'15*B
$e!urity 9i4ard $%&,$8/mdID89IEA:D8$1/6:I'7
/reate $tored Cro!edure 9i4ard $%&,$8/mdID89IEA:D8$C
/reate .iew 9i4ard $%&,$8/mdID89IEA:D8.I19
Inde2 'unin( 9i4ard $%&,$8/mdID89IEA:D8I,D1F'6,I,?
/reate Alert 9i4ard $%&,$8/mdID89IEA:D8A&1:'
Database )aintenan!e Clan
9i4ard
$%&,$8/mdID89IEA:D8)AI,'C&A,
9eb Assistant 9i4ard $%&,$8/mdID89IEA:D891BA$$'
/reate Database Ba!kup 9i4ard $%&,$8/mdID89IEA:D8BA/D6C
/reate 'ra!e 9i4ard $%&,$8/mdID89IEA:D8/:1A'1':A/1
3or more inormation, see $%& $erver Books *nline.
Summary

'he $%& 5unior Administrator sample appli!ation demonstrates the use o $%&"D)*. It
provides a!!ess to the various !olle!tions within $%& $erver and manipulates those
!olle!tions and the ob+e!ts !ontained in them. 'he sample also takes advanta(e o the
power and !onvenien!e o $%&",$, whi!h !an allow pro(rammati! a!!ess to the $%&
$erver 1nterprise )ana(er wi4ards.

You might also like