sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan opretter man indlejret SQL 2008-databasefil, hvis den ikke eksisterer?

Hvis det var mig (når det er mig...):

Du ønsker ikke specielt at forsøge at få databasefiler til at fungere ved at kopiere dem og vedhæfte dem - der er grunde til, hvorfor du måske vil, men jeg mener, at det er undtagelser snarere end regler.

Derfor, hvad du skal gøre er at scripte oprettelse af databasen, dvs. at bruge SQL DDL til at oprette databasen og tabellerne og alle de andre ting i dit skema.

Stort set alt, hvad du behøver for at gøre det muligt for dig at gøre dette, er passende rettigheder til serverforekomsten og derefter en forbindelsesstreng (som du sandsynligvis kan bygge bortset fra server-/forekomstnavnet).

Herfra:

  1. Er der en database? Hvis ikke, opret det.
  2. Hvis der er en database, er det så den rigtige skemaversion? Hvis det er for lavt, skal du enten opdatere det eller rådgive brugeren og gå ud med ynde, afhængigt af hvordan du ønsker, at tingene også skal fungere. Hvis det er for højt, skal du bare gå tilbage og fortælle, at en opdateret version af programmet er påkrævet
  3. Alt er, som det skal være, fortsæt.

Fra et kodesynspunkt:metode til at bestemme, om der findes en database; metode til at oprette en standard "tom" database med en versionstabel og et versionsnummer på 0; metoder til at bringe skemaet op til den aktuelle version ved at køre den relevante DDL (vi koder vores til C#, fordi det giver mere fleksibilitet, men du kan lige så godt køre DDL-scripts i rækkefølge).

Findes det:

    public virtual bool Exists()
    {
        bool exists = false;

        string masterConnectionString = this.CreateConnectionString(this.Server, this.FailoverServer, "master");

        this.DBConnection.ConnectionString = masterConnectionString;
        this.DBConnection.Open();
        try
        {
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = this.DBConnection;
            cmd.CommandText = "SELECT COUNT(name) FROM sysdatabases WHERE name = @DBName";
            cmd.Parameters.AddWithValue("@DBName", this.DBName);

            exists = (Convert.ToInt32(cmd.ExecuteScalar()) == 1);
        }
        finally
        {
            this.DBConnection.Close();
        }

        return exists;
    }

Opret en ny database:

    public virtual void CreateNew()
    {
        string createDDL = @"CREATE DATABASE [" + this.DBName + "]";

        this.BuildMasterConnectionString();

        this.DBConnection.Open();
        try
        {
            this.ExecuteSQLStmt(createDDL, this.DefaultSQLTimeout, null);
        }
        finally
        {
            this.DBConnection.Close();
        }

        createDDL = @"
                CREATE TABLE AAASchemaVersion 
                (
                    Version         int             NOT NULL,
                    DateCreated     datetime        NOT NULL,
                    Author          nvarchar(30)    NOT NULL,
                    Notes           nvarchar(MAX)   NULL 
                );

                ALTER TABLE AAASchemaVersion ADD CONSTRAINT PK_Version PRIMARY KEY CLUSTERED
                (
                    Version
                );

                INSERT INTO AAASchemaVersion
                    (Version, DateCreated, Author, Notes)
                VALUES
                    (0, GETDATE(), 'James Murphy', 'Empty Database')
            ";

        this.BuildConnectionString();
        this.ConnectionString += ";pooling=false";

        this.DBConnection.Open();
        try
        {
            this.ExecuteSQLStmt(createDDL, this.DefaultSQLTimeout, null);
        }
        catch (Exception ex)
        {
            throw new Exception("Exception while creating / initialising AAASchemaVersion", ex);
        }
        finally
        {
            this.DBConnection.Close();
        }
    }

Opdateringskoden er en smule mere kompleks, men kører i bund og grund ting som dette:

CREATE TABLE AuditUser
(    
    ID                  int IDENTITY(1,1)   NOT NULL,
    UserSourceTypeID    tinyint             NOT NULL,
    DateCreated         smalldatetime       NOT NULL,
    UserName            nvarchar(100)       NOT NULL        
);
ALTER TABLE AuditUser
ADD CONSTRAINT
    PK_AuditUser PRIMARY KEY CLUSTERED
    (
        ID
    ),
    CONSTRAINT [FK_AuditUser_UserSourceType] FOREIGN KEY
    (
        UserSourceTypeID
    ) REFERENCES UserSourceType (
        ID
    );

Alt sammen pakket ind i en transaktion pr. opdatering - så hvis opdateringen mislykkes, skal du forlade databasen i en kendt god tilstand.

Hvorfor gøre det på denne måde (i kode, som ikke er uden forsøg?) ja, slutresultatet er en høj grad af tillid til, at det skema, din app taler med, er det skema, din app forventer at tale med... rigtige tabeller, højre kolonner (i den rigtige rækkefølge, det er den rigtige type og den rigtige længde), osv. osv., og at dette vil fortsætte med at være tilfældet over tid.

Undskyld hvis det er lidt langt - men det er noget jeg er ret opsat på...



  1. Sådan kalder du en Stored Procedure fra Hibernate med både IN- og OUT-parametre

  2. migrerer til mysql i django

  3. MySQL - hentning af en HTML-tabel fra databasen - omvendte skråstreger før anførselstegn

  4. Vælg en bruger, der har kvalificerende data på flere rækker i tabellen wp_usermeta