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.");
 }
Beispiel #2
0
 /// <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);
 }
Beispiel #3
0
        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;
        }
Beispiel #4
0
        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;
        }
Beispiel #5
0
        /// <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);
        }