public void Initialize() { _log.Info("Initializing Auditing Databases."); var publicCredentials = BuildPublicCredentials(); var creatorCredentials = new DatabaseCredentials(_configuration.DatabaseCreatorUserName, _configuration.DatabaseCreatorPassword); foreach (var siteSubscriptionId in _configuration.SiteSubscriptionIds) { ServiceResponse response; var builder = new AuditingConnectionStringBuilder(_configuration.DatabaseInstanceName, siteSubscriptionId); var databaseInfo = new DatabaseInfo(_configuration.DatabaseInstanceName, builder.InitialCatalog, builder.UserId, builder.Password); var databaseManager = new DatabaseManager(_log, null); if (!DatabaseExists(builder.InitialCatalog)) { _log.Info("Creating database " + builder.InitialCatalog); response = databaseManager.CreateDatabase(databaseInfo, publicCredentials.UserName, publicCredentials.Password, _scriptResourceName, new AuditingScriptLoader(), creatorCredentials); } else { _log.Info("Updating database " + builder.InitialCatalog); response = databaseManager.UpdateDatabaseSchema(databaseInfo, publicCredentials.UserName, _scriptResourceName, new AuditingScriptLoader()); } CheckServiceResponse(response); } _log.Info("Auditing Databases Initialized."); }
/// <summary> /// Creates a new database. /// </summary> /// <param name="info">Information describing the database to affect.</param> /// <param name="databaseUserNamePublic">Name of a public database user to create.</param> /// <param name="databasePasswordPublic">The database password for the new public user.</param> /// <param name="scriptResourceNames">A list of the names of the resource files containing the DDL scripts.</param> /// <param name="scriptLoader">Class that can load assemblies containing SQL script resource files.</param> /// <param name="creatorCredentials">The credentials used to create the database.</param> /// <returns> /// An instance of the <see cref="ServiceResponse"/> class. /// </returns> public ServiceResponse CreateDatabase(DatabaseInfo info, string databaseUserNamePublic, string databasePasswordPublic, IEnumerable<string> scriptResourceNames, ScriptLoader scriptLoader, DatabaseCredentials creatorCredentials) { return CreateDatabase(info, databaseUserNamePublic, databasePasswordPublic, null, scriptResourceNames, scriptLoader, creatorCredentials); }
private ServiceResponse CreateDatabase(DatabaseInfo info, string databaseUserNamePublic, string databasePasswordPublic, string scriptResourceName, IEnumerable<string> scriptResourceNames, ScriptLoader scriptLoader, DatabaseCredentials creatorCredentials) { var creatorInfo = info.CloneWithNewCredentials(creatorCredentials); using (var database = new DatabaseManipulator(creatorInfo)) { try { smo.Server sqlServer = database.SqlServer; // Make sure SQL Server allows SQL logins if needed if (creatorInfo.HasUserName()) { if (database.LoginMode == smo.ServerLoginMode.Integrated) { _logger.Error("Database Server is not configured for mixed-mode authentication.", "Database Server", creatorInfo.ServerName); _response.AddError(string.Format(CultureInfo.InvariantCulture, "Database Server ({0}) is not configured for mixed-mode authentication.", creatorInfo.ServerName)); } } if (!_response.HasErrors) { if (!database.Exists()) { _logger.Info("Creating database.", "Database name", info.DatabaseName, "Database Server", info.ServerName); // Create new database var newDatabase = new smo.Database(sqlServer, info.DatabaseName); newDatabase.Create(); database.CreateLogin(info.UserName, info.Password, true); database.CreateLogin(databaseUserNamePublic, databasePasswordPublic, false); // I don't know why we have to dispose this here, but I was afraid to remove it database.Dispose(); UpdateDatabaseSchema(info, databaseUserNamePublic, scriptResourceName, scriptResourceNames, scriptLoader); _logger.Info("Database created successfully.", info.GenerateCustomLoggingProperties()); } else { _logger.Error("Database already exists.", info.GenerateCustomLoggingProperties()); _response.AddError(string.Format(CultureInfo.InvariantCulture, "Database ({0}) on server ({1}) already exists.", info.DatabaseName, info.ServerName)); } } } catch (Exception ex) { _logger.Error("Creation of Database failed.", ex, info.GenerateCustomLoggingProperties()); _response.AddError(string.Format(CultureInfo.InvariantCulture, "Creation of Database ({0}) on server ({1}) failed: {2}", info.DatabaseName, info.ServerName, ex.Message)); } } return _response; }
public ServiceResponse DestroyDatabase(DatabaseInfo info, DatabaseCredentials destroyerCredentials, string databaseUserNamePublic) { var creatorInfo = info.CloneWithNewCredentials(destroyerCredentials); using (var database = new DatabaseManipulator(creatorInfo)) { try { if (database.Exists()) { _logger.Info("Destroying database.", info.GenerateCustomLoggingProperties()); database.Destroy(); database.RemoveLogin(); database.RemoveLogin(databaseUserNamePublic); _logger.Info("Database destroyed successfully.", info.GenerateCustomLoggingProperties()); } else { _logger.Info("Database does not exist.", info.GenerateCustomLoggingProperties()); _response.AddInfo("Database ({0}) on server ({1}) does not exist.", info.DatabaseName, info.ServerName); } } catch (Exception ex) { _logger.Error("Destruction of database failed.", ex, info.GenerateCustomLoggingProperties()); _response.AddError("Destruction of database ({0}) on server ({1}) failed.", info.DatabaseName, info.ServerName); } } return _response; }
/// <summary> /// Clones this <see cref="DatabaseInfo"/>the with specified credentials. /// </summary> /// <param name="credentials">The new credentials.</param> /// <returns>A clone of <see cref="DatabaseInfo"/> with new credentials.</returns> public DatabaseInfo CloneWithNewCredentials(DatabaseCredentials credentials) { if (credentials == null) { return new DatabaseInfo(_serverName, _databaseName, null, null); } return new DatabaseInfo(_serverName, _databaseName, credentials.UserName, credentials.Password); }