It’s pretty easy to create a content database via the browser and you can create a new content database easily enough when creating a new site collection via stsadm, createsiteinnewdb
, or directly using addcontentdb
. But what if you need to script the creation of a new content database without creating a site collection and you need to set some of the properties found via the browser that addcontentdb
doesn’t provide? To do this I created a new command which basically does the same as addcontentdb
but adds the additional properties found within central admin: gl-createcontentdb
. To accomplish this I first do some checks to make sure that you’re not trying to create a database using a name that already exists. I then use the SPWebApplication
’s ContentDatabases
property to add the new database using the parameters provided. Once the database has been created we can set the search service settings:
1public override int Run(string command, StringDictionary keyValues, out string output)
2{
3 output = string.Empty;
4
5 InitParameters(keyValues);
6
7 string dbserver = Params["dbserver"].Value;
8 string dbname = Params["dbname"].Value;
9
10 if (string.IsNullOrEmpty(dbserver))
11 {
12 dbserver = SPWebService.ContentService.DefaultDatabaseInstance.NormalizedDataSource;
13 }
14
15 using (SPSite site = new SPSite(Params["webapp"].Value))
16 {
17 SPContentDatabase db = null;
18 foreach (SPContentDatabase tempDB in site.WebApplication.ContentDatabases)
19 {
20 if (tempDB.Name.ToLower() == dbname.ToLower())
21 {
22 db = tempDB;
23 break;
24 }
25 }
26 if (db != null)
27 throw new Exception("Content database already exists.");
28
29 SPObjectStatus status = (SPObjectStatus)Enum.Parse(typeof(SPObjectStatus), Params["status"].Value, true);
30
31 db = site.WebApplication.ContentDatabases.Add(dbserver, dbname, null, null,
32 int.Parse(Params["warningsitecount"].Value),
33 int.Parse(Params["maxsites"].Value), (status == SPObjectStatus.Online?0:1));
34
35 if (Params["searchserver"].UserTypedIn && !string.IsNullOrEmpty(Params["searchserver"].Value))
36 {
37 // If they specified a search server then we need to try and find a valid
38 // matching search server using the server address property.
39 SPSearchService service = SPFarm.Local.Services.GetValue<SPSearchService>("SPSearch");
40 SPServiceInstance searchServiceServer = null;
41 foreach (SPServiceInstance tempsvc in service.Instances)
42 {
43 if (!(tempsvc is SPSearchServiceInstance))
44 continue;
45
46 if (tempsvc.Status != SPObjectStatus.Online)
47 continue;
48
49 if (tempsvc.Server.Address.ToLowerInvariant() == Params["searchserver"].Value.ToLowerInvariant())
50 {
51 // We found a match so bug out of the loop.
52 searchServiceServer = tempsvc;
53 break;
54 }
55 }
56 if (searchServiceServer != null)
57 {
58 db.SearchServiceInstance = searchServiceServer;
59 }
60 else
61 throw new Exception("Search server not found.");
62 }
63 else if (Params["searchserver"].UserTypedIn)
64 {
65 // The user specified the searchserver switch with no value which is what we use to indicate
66 // clearing the value.
67 db.SearchServiceInstance = null;
68 }
69
70 db.Update();
71 }
72
73 return 1;
74}
The syntax of the command can be seen below:
C:\>stsadm -help gl-createcontentdb
stsadm -o gl-createcontentdb
Creates a new content database.
Parameters:
-dbname <content database name>
-webapp <web application url>
[-dbserver <content database server>]
[-maxsites <maximum number of sites allowed in the db (default is 15000)>]
[-warningsitecount <number of sites before a warning event is generated (default is 9000)>]
[-searchserver <search server (leave empty to clear the search server)>]
[-dbuser <database username (if using SQL Authentication and not Windows Authentication)>]
[-dbuser <database username (if using SQL Authentication and not Windows Authentication)>]
[-dbpwd <database password (if using SQL Authentication and not Windows Authentication)>]
[-status <online | disabled>]
Here’s an example of how to create a new content database:
stsadm -o gl-createcontentdb -dbname "SharePoint_ContentDB1" -webapp "http://intranet" -maxsites 500 -warningsitecount 400