2009-07-09 9 views
8

Ich schreibe ein Installationsskript, das alle Tabellen, gespeicherte Prozeduren, Ansichten, Volltextindexe, Benutzer usw. installiert.SQL vollständig leere Datenbank

Alles funktioniert gut, wenn der Benutzer über alle richtigen Berechtigungen verfügt und das Skript von Anfang bis Ende ausgeführt wird. Wenn jedoch das Skript irgendwo mitten in der Zeit stirbt, kann es nicht einfach erneut ausgeführt werden.

Um dies zu erreichen, möchte ich im Grunde die Datenbank in einen "brandneuen" Zustand, wo es nichts hat.

Ich weiß, wie Sie jede Tabelle/sp/view .. selbst löschen, aber ich suche nach einer allgemeineren Möglichkeit, die Datenbank zurückzusetzen.

Ich muss auch in der Lage sein, Volltext-Kataloge und Benutzer zu löschen.

Danke für jede Hilfe.

Ausführen von SQL Server 2005

Antwort

6

Klingt wie ein Job für Drop Database:

-- SQL Server Syntax 
DROP DATABASE [ IF EXISTS ] { database_name | database_snapshot_name } [ ,...n ] [;] 
+0

Ich würde diesen Weg aus verschiedenen Gründen gehen. 1. Sie können sicher sein, dass keine "alten" Daten in der Datenbank verbleiben. 2. Es hält Ihr Entwickler/Test-Modell ehrlich, indem es erfordert, dass die Datenbank von Grund auf neu erstellt wird. Wenn Sie neue Tabellen, Sichten, Prozeduren usw. hinzufügen, sollte dies Teil des Implementierungs-/Installations-/Testzyklus sein. Stellen Sie keine Datenbank bereit, stellen Sie die Mittel zur Verfügung, um sie zu erstellen. –

+0

Einverstanden. Du erschaffst * die * Datenbank, ohne eine existierende zu unterhalten; Wenn Sie es nicht genau so erstellen können, wie Sie es möchten, sollten Sie es einfach fallen lassen und es erneut versuchen. –

7

Können Sie laufen das gesamte Skript innerhalb einer Transaktion und dann ein Rollback aufrufen, wenn es nicht funktioniert?

Ein CREATE TABLE kann genauso einfach zurückgesetzt werden wie ein INSERT/UPDATE.

+0

, dass die Art und Weise natürlich zu gehen, vergiss meine Antwort =) –

+0

@d. Ich bin mir nicht sicher, warum es besser ist. Es ist für die Benutzer Berechtigungen oder gibt es andere Gründe? – Jonathan

+0

Ich stimme zu .. wenn eine Drop/Create-Datenbank eine Option ist, könnten Sie leicht damit gehen. –

2

Brand new enthält nichts? Löschen Sie die Datenbank und erstellen Sie sie erneut, wenn Sie dazu berechtigt sind.

-1

Sie können das gesamte Skript in einer Transaktion ausführen, so dass Sie es jederzeit zurücksetzen können.

Zweite Option - vor der Installation immer ein Backup erstellen. Wenn dies fehlschlägt, stellen Sie die Datenbank aus der Sicherung wieder her

0

Ich bin mir nicht sicher, ob dies das ist, was Sie suchen, aber für jedes Objekt könnten Sie testen, ob es existiert, bevor Sie es erstellen. Dann könnten Sie das Skript erneut ausführen, wenn es in der Mitte fehlschlägt.

IF EXISTS(SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(@Object) AND type = (@Type)) 

...

0

Wenn Sie Ihren scripting Prozess pro Objekt automatisiert haben, sollten Sie in der Lage sein, den gesamten Prozess in einer Transaktion zu wickeln und Fehler für jeden statment DDL Handhabung bieten. Dies funktioniert auch beim Anwenden von Schema-Updates. Bitte beachten Sie, dass dies auf Upgrade-Skripten basiert, die Red-Gate SQL Compare generiert.

Rubrik:

SET NUMERIC_ROUNDABORT OFF 
GO 
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT, QUOTED_IDENTIFIER, ANSI_NULLS ON 
GO 
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE id=OBJECT_ID('tempdb..#tmpErrors')) DROP TABLE #tmpErrors 
GO 
CREATE TABLE #tmpErrors (Error int) 
GO 
SET XACT_ABORT ON 
GO 
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 
GO 
BEGIN TRANSACTION 
GO 

Footer:

IF EXISTS (SELECT * FROM #tmpErrors) ROLLBACK TRANSACTION 
GO 
IF @@TRANCOUNT>0 BEGIN 
    PRINT 'Script succeeded' 
    COMMIT TRANSACTION 
END 
ELSE BEGIN 
    PRINT 'Script failed' 
END 
GO 
DROP TABLE #tmpErrors 

Wrapper (für jede Datenbank-Objekt):

/* Insert Data Definition here then append with...*/ 
GO 
IF @@ERROR<>0 AND @@TRANCOUNT>0 ROLLBACK TRANSACTION 
GO 
IF @@TRANCOUNT=0 BEGIN INSERT INTO #tmpErrors (Error) SELECT 1 BEGIN TRANSACTION END 
GO 
0

Red G Ate's SQL Compare wird es für Sie tun, es ist ein großartiges Werkzeug.

-1

Tropfen und neu erstellen DB:

use master 
IF EXISTS(select * from sys.databases where name='YourDBName') 
DROP DATABASE YourDBName 
CREATE database YourDBName 
Verwandte Themen