2009-07-09 14 views
8

Sto scrivendo uno script di installazione che installa tutte le tabelle, stored procedure, viste, indici di testo completo, utenti ecc.Database SQL completamente vuoto

Tutto funziona correttamente se l'utente dispone di tutte le autorizzazioni corrette e lo script viene eseguito dall'inizio alla fine. Tuttavia se la sceneggiatura muore da qualche parte a metà strada non può essere eseguita di nuovo.

Per fare ciò, voglio sostanzialmente riportare il database in uno stato "nuovo di zecca" in cui non ha nulla.

Mi rendo conto di come rilasciare ogni tabella/sp/view .. da soli, ma sto cercando un modo più generale per reimpostare il database.

Devo anche essere in grado di eliminare cataloghi e utenti di testo completo.

Grazie per qualsiasi aiuto.

esecuzione di SQL Server 2005

risposta

6

Suona come un lavoro per Drop Database:

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

Vorrei andare in questo modo per un paio di motivi. 1. Ti assicuriamo che nessun dato "vecchio" è rimasto nel database. 2. Mantiene onesto il tuo modello di sviluppo/testing richiedendo che il database sia creato da zero. Se aggiungi nuove tabelle, viste, procedure, ecc. Dovrebbe essere parte del ciclo deploy/install/test. Non distribuire un database, distribuire i mezzi per crearlo. –

+0

concordato. Stai * creando * il database, senza mantenere uno esistente; se non riesci a crearlo esattamente nel modo desiderato, dovresti riuscire a rilasciarlo e riprovare. –

7

È possibile eseguire l'intero script all'interno di una transazione e quindi chiamare un rollback se non riesce?

È possibile eseguire il rollback di CREATE TABLE con la stessa facilità di INSERT/UPDATE.

+0

che è, naturalmente, la strada da percorrere, non importa la mia risposta =) –

+0

@d. Non sono sicuro del perché sia ​​così forte. È per le autorizzazioni degli utenti o c'è un altro motivo? – Jonathan

+0

Sono d'accordo .. se un drop/create database è un'opzione, si potrebbe facilmente andare con quello. –

2

Nuovissimo contenente nulla? Eliminare il database e ricrearlo se si dispone delle autorizzazioni per farlo.

-1

È possibile eseguire l'intero script in un'unica transazione, in modo da poterlo ripristinare in qualsiasi momento.

Seconda opzione: prima dell'installazione, creare sempre un backup. Se fallisce, ripristinare il database dal backup

0

Non sono sicuro se questo è ciò che stai cercando, ma per ogni oggetto, puoi testare se esiste prima di crearlo. Quindi potresti eseguire di nuovo lo script se fallisce nel mezzo.

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

...

0

se avete il vostro processo di script automatizzato per oggetto, si dovrebbe essere in grado di avvolgere l'intero processo in una transazione e fornire la gestione degli errori per ogni statment DDL. Questo funziona bene anche quando si applicano gli aggiornamenti dello schema. Si noti che questo è basato sugli script di aggiornamento generati da Red-Gate SQL Compare.

Intestazione:

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 

piè di pagina:

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 (Per ogni oggetto di database):

/* 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 SQL Compare di ate lo farà per te, è un ottimo strumento.

-1

goccia e ricreare DB:

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