none
erstelle DB via Gui vs. Script RRS feed

  • Frage

  • Hallo,

    ich habe eine recht einfache Frage, stehe aber derbe auf dem Schlauch:

    Szenario 1)

    Ich erzeuge eine normale Datenbank über die GUI. Die Werte für die Files entsprechen hierbei den Werten, welche in der Model-Database hinterlegt sind.

    Szenario 2)

    Ich erzeuge eine normale Datenbank über ein einfaches Script, und hier werden die Werte aus der Model-Database einfach gekonnt ignoriert.

    DECLARE 
    	@SqlCommand NVARCHAR(255),
    	@DatabaseName NVARCHAR(63)
    
    	SET @DatabaseName = 'Kreuzer_DB'
    	SET @SqlCommand = N'CREATE DATABASE ' + @DatabaseName
    
    EXECUTE sp_executesql @SqlCommand

    Für mein Verständis sollte doch die Model-Database die Vorgabe für jede Art neuer Datenbank sein, oder hab ich in der Schule falsch aufgepasst?

    Besten Dank

    Grüße

    Andreas

    Donnerstag, 17. November 2016 11:46

Antworten

  • Ja, so sollte es teilweise sein.

    CREATE DATABASE (SQL Server Transact-SQL)

    Die model-Datenbank und das Erstellen neuer Datenbanken

    Alle benutzerdefinierten Objekte in der model-Datenbank werden in alle neu erstellten Datenbanken kopiert.  Sie können der model-Datenbank beliebige Objekte (z. B. Tabellen, Sichten, gespeicherte Prozeduren, Datentypen usw.) hinzufügen, die in allen neu erstellten Datenbanken enthalten sein sollen.

    Wenn eine database_name-CREATE DATABASE-Anweisung ohne zusätzliche Größenparameter angegeben wird, erhält die primäre Datendatei die gleiche Größe wie die primäre Datei in der model-Datenbank.

    Das gilt also nur für die primäre Datendatei, nicht für das Transaktionslog.


    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu

    Donnerstag, 17. November 2016 12:14
    Beantworter

Alle Antworten

  • Hallo Andreas,

    vorab mal so gefragt: Welche Einstellungen aus der model DB fehlen dir denn?

    Wenn Du eine Datenbank über die Oberfläche des SSMS erstellst, wird bspw. folgendes ausgeführt:

    CREATE DATABASE [TestDatabase1]
     CONTAINMENT = NONE
     ON  PRIMARY 
    ( NAME = N'TestDatabase1', FILENAME = N'F:\SQL\Data\TestDatabase1.mdf' , SIZE = 5120KB , FILEGROWTH = 1024KB )
     LOG ON 
    ( NAME = N'TestDatabase1_log', FILENAME = N'F:\SQL\Data\TestDatabase1_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%)
    GO
    ALTER DATABASE [TestDatabase1] SET COMPATIBILITY_LEVEL = 120
    GO
    ALTER DATABASE [TestDatabase1] SET ANSI_NULL_DEFAULT OFF 
    GO
    ALTER DATABASE [TestDatabase1] SET ANSI_NULLS OFF 
    GO
    ALTER DATABASE [TestDatabase1] SET ANSI_PADDING OFF 
    GO
    ALTER DATABASE [TestDatabase1] SET ANSI_WARNINGS OFF 
    GO
    ALTER DATABASE [TestDatabase1] SET ARITHABORT OFF 
    GO
    ALTER DATABASE [TestDatabase1] SET AUTO_CLOSE OFF 
    GO
    ALTER DATABASE [TestDatabase1] SET AUTO_SHRINK OFF 
    GO
    ALTER DATABASE [TestDatabase1] SET AUTO_CREATE_STATISTICS ON(INCREMENTAL = OFF)
    GO
    ALTER DATABASE [TestDatabase1] SET AUTO_UPDATE_STATISTICS ON 
    GO
    ALTER DATABASE [TestDatabase1] SET CURSOR_CLOSE_ON_COMMIT OFF 
    GO
    ALTER DATABASE [TestDatabase1] SET CURSOR_DEFAULT  GLOBAL 
    GO
    ALTER DATABASE [TestDatabase1] SET CONCAT_NULL_YIELDS_NULL OFF 
    GO
    ALTER DATABASE [TestDatabase1] SET NUMERIC_ROUNDABORT OFF 
    GO
    ALTER DATABASE [TestDatabase1] SET QUOTED_IDENTIFIER OFF 
    GO
    ALTER DATABASE [TestDatabase1] SET RECURSIVE_TRIGGERS OFF 
    GO
    ALTER DATABASE [TestDatabase1] SET  DISABLE_BROKER 
    GO
    ALTER DATABASE [TestDatabase1] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
    GO
    ALTER DATABASE [TestDatabase1] SET DATE_CORRELATION_OPTIMIZATION OFF 
    GO
    ALTER DATABASE [TestDatabase1] SET PARAMETERIZATION SIMPLE 
    GO
    ALTER DATABASE [TestDatabase1] SET READ_COMMITTED_SNAPSHOT OFF 
    GO
    ALTER DATABASE [TestDatabase1] SET  READ_WRITE 
    GO
    ALTER DATABASE [TestDatabase1] SET RECOVERY SIMPLE 
    GO
    ALTER DATABASE [TestDatabase1] SET  MULTI_USER 
    GO
    ALTER DATABASE [TestDatabase1] SET PAGE_VERIFY CHECKSUM  
    GO
    ALTER DATABASE [TestDatabase1] SET TARGET_RECOVERY_TIME = 0 SECONDS 
    GO
    ALTER DATABASE [TestDatabase1] SET DELAYED_DURABILITY = DISABLED 
    GO
    USE [TestDatabase1]
    GO
    IF NOT EXISTS (SELECT name FROM sys.filegroups WHERE is_default=1 AND name = N'PRIMARY') ALTER DATABASE [TestDatabase1] MODIFY FILEGROUP [PRIMARY] DEFAULT
    GO

    Du siehst, da fehlt in deinem Skript noch einiges.

    Die Einstellungen werden wohl nicht automatisch übernommen sondern die GUI liest für die Generierung der neuen Datenbank die Einstellungen aus der model Datenbank und generiert damit dann die einzelnen Befehlsaufrufe. Wenn ich die MSDN Seite zu CREATE Database so lese, würde ich allerdings auch annehmen, dass ein einfaches CREATE DATABASE die Einstellungen der model DB übernehmen sollte.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Donnerstag, 17. November 2016 12:08
    Moderator
  • Ja, so sollte es teilweise sein.

    CREATE DATABASE (SQL Server Transact-SQL)

    Die model-Datenbank und das Erstellen neuer Datenbanken

    Alle benutzerdefinierten Objekte in der model-Datenbank werden in alle neu erstellten Datenbanken kopiert.  Sie können der model-Datenbank beliebige Objekte (z. B. Tabellen, Sichten, gespeicherte Prozeduren, Datentypen usw.) hinzufügen, die in allen neu erstellten Datenbanken enthalten sein sollen.

    Wenn eine database_name-CREATE DATABASE-Anweisung ohne zusätzliche Größenparameter angegeben wird, erhält die primäre Datendatei die gleiche Größe wie die primäre Datei in der model-Datenbank.

    Das gilt also nur für die primäre Datendatei, nicht für das Transaktionslog.


    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu

    Donnerstag, 17. November 2016 12:14
    Beantworter
  • Ha,

    "Das gilt also nur für die primäre Datendatei, nicht für das Transaktionslog." da liegt also des Pudels Kern.

    Mir fehlte bei der neu via Script erzeugten Datenbank die richtige Größe des Transanktionlogs. Das bestätigt ja Andreas mit seiner Aussage.

    Bestens geklärt, ich danke euch.

    Dann geht es nun an die Umsetzung.

    Grüße

    Andreas

    Donnerstag, 17. November 2016 13:29
  • ich kann aber bestätigen, dass dieses Verhalten nicht ganz konsistent ist

    zB erhält man durchaus mal ein größeres Log in der model konfiguriert hat, wird das Log von neuen Datenbanken auch mal größer. Aber nicht gleichgroß sondern einige Megabytes.

    In meinen Augen eine Ungenauigkeit im Algorithmus und ev mit Transaktionen in der model zusammenhängend.

    Seit SQL Server 2016 klappt es aber konsistent für Log als auch Datafile. Zumindest bisher :)


    Andreas Wolter (Blog | Twitter)
    MCSM: Microsoft Certified Solutions Master Data Platform/SQL Server 2012
    MCM SQL Server 2008
    MVP Data Platform
    www.SarpedonQualityLab.com | www.andreas-wolter.com

    Donnerstag, 17. November 2016 15:01