Benutzer mit den meisten Antworten
erstelle DB via Gui vs. Script

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
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
- Als Antwort markiert Andreas Kreuzberg Donnerstag, 17. November 2016 13:29
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
- Bearbeitet Stefan FalzModerator Donnerstag, 17. November 2016 12:11
-
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
- Als Antwort markiert Andreas Kreuzberg Donnerstag, 17. November 2016 13:29
-
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
-
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