Discussione:
svuotare db
(troppo vecchio per rispondere)
Marco Bosco
2008-03-17 20:23:13 UTC
Permalink
Ciao

mi aiutate a scrivere uno script
che cicla su tutte le tabelle del db
ed esegue truncate table
disabilitando l'inegrità referenziale.

Vorrei cioè una procedura per svuotare il db.

ciao

grazie

mb
tiriamoavanti
2008-03-17 20:43:34 UTC
Permalink
"Marco Bosco" <***@tiscali.it> ha scritto nel messaggio news:47ded311$0$16031$***@news.tiscali.it...

/* ecco qualcosa partorito dalla mia mente procedurale qualche tempo fa */
CREATE PROCEDURE [dbo].[DW_9TRONCA_TUTTO] AS

SET NOCOUNT ON

DECLARE @TRONCA NCHAR(512)

DECLARE @TNAME CHAR(50)

DECLARE ALL_TABLES CURSOR LOCAL FAST_FORWARD FOR

SELECT [NAME] FROM SYSOBJECTS WHERE XTYPE = 'U' AND [NAME] LIKE
'DW%'

OPEN ALL_TABLES

-- READ FUORI LOOP

FETCH NEXT FROM ALL_TABLES INTO @TNAME

WHILE @@FETCH_STATUS = 0

BEGIN

SET @TRONCA = 'TRUNCATE TABLE ' + RTRIM(LTRIM(@TNAME))

-- SELECT @TRONCA

EXEC sp_executesql @TRONCA

FETCH NEXT FROM ALL_TABLES INTO @TNAME

END

CLOSE ALL_TABLES

DEALLOCATE ALL_TABLES

CHECKPOINT

SET NOCOUNT OFF
Marco Bosco
2008-03-17 21:08:42 UTC
Permalink
Grazie
Post by tiriamoavanti
/* ecco qualcosa partorito dalla mia mente procedurale qualche tempo fa */
CREATE PROCEDURE [dbo].[DW_9TRONCA_TUTTO] AS
SET NOCOUNT ON
DECLARE ALL_TABLES CURSOR LOCAL FAST_FORWARD FOR
SELECT [NAME] FROM SYSOBJECTS WHERE XTYPE = 'U' AND [NAME] LIKE
'DW%'
OPEN ALL_TABLES
-- READ FUORI LOOP
BEGIN
END
CLOSE ALL_TABLES
DEALLOCATE ALL_TABLES
CHECKPOINT
SET NOCOUNT OFF
Alberto Dallagiacoma
2008-03-17 20:50:42 UTC
Permalink
Ciao Marco,
Per ciclare su tutte le tabelle del DB puoi usare la Stored Procedure (non
documentata sui BOL) sp_MSForEachTable. Per fare quello che chiedi, puoi
provare questo script:

-- Disabilita l'integrità referenziale
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO

-- Esegue la "truncate" sulle tabelle
EXEC sp_MSForEachTable 'TRUNCATE TABLE ?'

-- Riabilita l'integrità referenziale
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
GO
--
Alberto Dallagiacoma - [MCP, MCTS SQL Server 2005]
My Blog: http://blogs.ugidotnet.org/alby
UGIdotNET: http://www.ugidotnet.org
Alberto Dallagiacoma
2008-03-17 20:57:00 UTC
Permalink
Ooops... Mi sono dimenticato di citare la fonte dello script (giusto dare a
Cesare quel che è di Cesare ;-)):

http://www.sqljunkies.com/WebLog/roman/archive/2006/03/08/18620.aspx
--
Alberto Dallagiacoma - [MCP, MCTS SQL Server 2005]
My Blog: http://blogs.ugidotnet.org/alby
UGIdotNET: http://www.ugidotnet.org
Marco Bosco
2008-03-17 21:08:35 UTC
Permalink
Grazie Alberto.
Post by Alberto Dallagiacoma
Ooops... Mi sono dimenticato di citare la fonte dello script (giusto dare
http://www.sqljunkies.com/WebLog/roman/archive/2006/03/08/18620.aspx
--
Alberto Dallagiacoma - [MCP, MCTS SQL Server 2005]
My Blog: http://blogs.ugidotnet.org/alby
UGIdotNET: http://www.ugidotnet.org
Lorenzo Benaglia
2008-03-17 22:34:26 UTC
Permalink
Post by Marco Bosco
mi aiutate a scrivere uno script
che cicla su tutte le tabelle del db
ed esegue truncate table
disabilitando l'inegrità referenziale.
Vorrei cioè una procedura per svuotare il db.
Dato che vuoi eliminare tutti i dati, perché non generare semplicemente uno
script dei metadati? :-D
Sia Enterprise Manager che SQL Server Management Studio offrono una
procedura guidata semplicissima per ottenere questo file ed una volta
ottenuto puoi eliminare il db coi dati, ricreandolo "immacolato" rieseguendo
lo script.

Per maggiori info:
http://msdn2.microsoft.com/en-us/library/ms178078.aspx
Post by Marco Bosco
grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
Marco Bosco
2008-03-17 22:47:39 UTC
Permalink
Post by Lorenzo Benaglia
Dato che vuoi eliminare tutti i dati, perché non generare semplicemente uno
script dei metadati? :-D
Sia Enterprise Manager che SQL Server Management Studio offrono una
procedura guidata semplicissima per ottenere questo file ed una volta
ottenuto puoi eliminare il db coi dati, ricreandolo "immacolato"
rieseguendo lo script.
....sì è vero.
La mia era solo una curiosità su come poter implementare la cosa
programmaticamente.
Visto che ci sono colgo l'occasioni per porti un quesito.
Sto cercando di modificare lo script che ha postato 'tiriamoavanti' sono 2
ore ma non ne vengo a capo.
Per come lo ha postato lui non gestisce gli schemi e inoltre si blocca nel
caso ci siano dei vincoli.

Ho cercato di modificare lo script per risolvere i due problemi.
Ma mi da un errore nella disattivazione dei vincoli.
Sono sicuro che tu ti rendereai conto del problema in un secondo......

Nel caso tu possa aiutarmi ti ringrazio in anticipo.

ciao

MB

CREATE PROCEDURE [Systems].[usp_SvuotaDB] AS

SET NOCOUNT ON

DECLARE @TRONCA NCHAR(512)

DECLARE @TNAME CHAR(50)

DECLARE ALL_TABLES CURSOR LOCAL FAST_FORWARD FOR --ALL_TABLES è il nome del
cursore.

SELECT [NAME] FROM SYSOBJECTS WHERE XTYPE = 'U' AND [NAME] LIKE 'tbl_%'

--U=tabella definita dall'utente

OPEN ALL_TABLES

-- READ FUORI LOOP

FETCH NEXT FROM ALL_TABLES INTO @TNAME

WHILE @@FETCH_STATUS = 0

BEGIN


declare @schema nvarchar(128);

set @schema = (select table_schema from INFORMATION_SCHEMA.tables

where table_name =@TNAME)

declare @complete_tblName nvarchar(512);

set @complete_tblName = '[' + @schema + '].' + RTRIM(LTRIM(@TNAME));


declare @altertbl as nvarchar(1024)

set @altertbl = 'ALTER TABLE ' + @complete_tblName + ' NOCHECK CONSTRAINT
ALL'

EXEC @altertbl


SET @TRONCA = 'TRUNCATE TABLE ' + @complete_tblName

-- SELECT @TRONCA

EXEC sp_executesql @TRONCA

set @altertbl = 'ALTER TABLE ' + @complete_tblName + ' CHECK CONSTRAINT ALL'

EXEC @altertbl

FETCH NEXT FROM ALL_TABLES INTO @TNAME

END

CLOSE ALL_TABLES --Chiude un cursore aperto rilasciando il set di risultati
corrente e liberando i blocchi dei cursori mantenuti attivi sulle righe in
cui è posizionato il cursore

DEALLOCATE ALL_TABLES --Rimuove un riferimento a un cursore

CHECKPOINT --Scrive su disco le pagine dirty

SET NOCOUNT OFF
tiriamoavanti
2008-03-18 09:02:31 UTC
Permalink
"Marco Bosco" <***@tiscali.it> ha scritto nel messaggio news:47def4eb$0$21196$***@news.tiscali.it...
iL TUO SCRIPT FUNZIONA su queste tabelle su 2005; a te che errore da?

drop table pippo

drop table pluto

create table pippo (a int)

create table pluto (a int primary key)

GO

ALTER TABLE pippo ADD CONSTRAINT FK_pippo FOREIGN KEY (a) REFERENCES pluto
(a)

GO
Marco Bosco
2008-03-18 09:16:10 UTC
Permalink
Post by tiriamoavanti
iL TUO SCRIPT FUNZIONA su queste tabelle su 2005; a te che errore da?
drop table pippo
drop table pluto
create table pippo (a int)
create table pluto (a int primary key)
GO
ALTER TABLE pippo ADD CONSTRAINT FK_pippo FOREIGN KEY (a) REFERENCES pluto
(a)
GO
il seguente errore:

Messaggio 4712, livello 16, stato 1, riga 1

Impossibile troncare la tabella 'AnagrafeContatti.tbl_Titoli' perché è
presente un vincolo FOREIGN KEY che vi fa riferimento.



sai aiutarmi? (grazie)

ciao
mb
tiriamoavanti
2008-03-18 14:28:39 UTC
Permalink
Post by Marco Bosco
Post by tiriamoavanti
iL TUO SCRIPT FUNZIONA su queste tabelle su 2005; a te che errore da?
Impossibile troncare la tabella 'AnagrafeContatti.tbl_Titoli' perché è
presente un vincolo FOREIGN KEY che vi fa riferimento.
non ho ancora avuto tempo di fare delle prove, ma l'errore non è nella
logica del loop, ma nel comando che esegui per togliere i constraint...
quindi che usi un cursore o la "foreach" non cambia nulla.
E' sulla "alter table NOCHECK" che devi lavorare.
La prova che ho fatto con 1 solo constraint ha funzionato, però forse ho
sbagliato test. :)
perché non provi con due giri? prima tutte le alter eppoi tutte le truncate?
Lorenzo Benaglia
2008-03-18 14:39:14 UTC
Permalink
Post by tiriamoavanti
E' sulla "alter table NOCHECK" che devi lavorare.
No. Dai BOL: "You cannot use TRUNCATE TABLE on tables that: Are referenced
by a FOREIGN KEY constraint..."
Sei costretto a rimuovere il constraint FK... ma ha senso una cosa del
genere se poi devi ricrearlo?

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
Marco Bosco
2008-03-18 14:49:35 UTC
Permalink
Post by Lorenzo Benaglia
Post by tiriamoavanti
E' sulla "alter table NOCHECK" che devi lavorare.
No. Dai BOL: "You cannot use TRUNCATE TABLE on tables that: Are referenced
by a FOREIGN KEY constraint..."
Sei costretto a rimuovere il constraint FK... ma ha senso una cosa del
genere se poi devi ricrearlo?
....Lorenzo.

Nei tuoi post noto la presenza delle parole "cancellarlo" & "ricrearlo" a
riguardo dei FK.
vorrei chiederti se sarebbe più corretto dire abilitare & disabilitare?
infatti:

EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO

disabilita o cancella i vincoli?

Te lo chiedo giusto per capire meglio.

ciao

mb
Lorenzo Benaglia
2008-03-18 14:52:31 UTC
Permalink
Post by Marco Bosco
....Lorenzo.
Nei tuoi post noto la presenza delle parole "cancellarlo" &
"ricrearlo" a riguardo dei FK.
vorrei chiederti se sarebbe più corretto dire abilitare &
disabilitare?
....Marco.

No, non è più corretto, è sbagliato.
Se ho scritto "cancellarlo" intendevo proprio un bel DROP:

ALTER TABLE <schema>.<tabella dalla parte molti della relazione> DROP
CONSTRAINT <nome constraint foreign key>;
Post by Marco Bosco
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO
disabilita o cancella i vincoli?
Li disabilita, ma sei tu il primo a dire che la TRUNCATE non funziona :-D
Post by Marco Bosco
Te lo chiedo giusto per capire meglio.
Bene, ora è chiaro? :-)

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
tiriamoavanti
2008-03-18 15:16:24 UTC
Permalink
Post by Lorenzo Benaglia
Post by Marco Bosco
disabilita o cancella i vincoli?
Li disabilita, ma sei tu il primo a dire che la TRUNCATE non funziona :-D
Undoubtedly:

use tempdb

go

drop table pippo

drop table pluto

GO

create table pippo (a int)

create table pluto (a int primary key)

GO

ALTER TABLE pippo ADD CONSTRAINT FK_pippo FOREIGN KEY (a) REFERENCES pluto
(a)

GO

truncate table pluto

ALTER TABLE pippo NOCHECK CONSTRAINT ALL

go

truncate table pluto
Lorenzo Benaglia
2008-03-18 15:33:15 UTC
Permalink
Post by tiriamoavanti
use tempdb
go
drop table pippo
drop table pluto
GO
create table pippo (a int)
create table pluto (a int primary key)
GO
ALTER TABLE pippo ADD CONSTRAINT FK_pippo FOREIGN KEY (a) REFERENCES
pluto (a)
GO
truncate table pluto
ALTER TABLE pippo NOCHECK CONSTRAINT ALL
go
truncate table pluto
Il tuo esempio in entrambi i casi la truncate genere una eccezione:

Msg 4712, Level 16, State 1, Line 1
Cannot truncate table 'pluto' because it is being referenced by a FOREIGN
KEY constraint.

Per risolvere il provlema devi eliminare il constraint FK_pippo eseguendo il
comando:

ALTER TABLE pippo DROP CONSTRAINT FK_pippo;

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
tiriamoavanti
2008-03-18 15:18:48 UTC
Permalink
Post by Lorenzo Benaglia
No. Dai BOL: "You cannot use TRUNCATE TABLE on tables that: Are referenced
by a FOREIGN KEY constraint..."
Sei costretto a rimuovere il constraint FK... ma ha senso una cosa del
genere se poi devi ricrearlo?
E si taglia la testa al toro

Marco, passa a: DELETE * FROM mytable
[e non dire: "ma la truncate non viene loggata" ;)]
Lorenzo Benaglia
2008-03-18 15:31:19 UTC
Permalink
Post by tiriamoavanti
[e non dire: "ma la truncate non viene loggata" ;)]
Uh?

"TRUNCATE TABLE (Transact-SQL)

Removes all rows from a table without logging the individual row deletions.
TRUNCATE TABLE is functionally the same as the DELETE statement with no
WHERE clause; however, TRUNCATE TABLE is faster and *uses fewer system and
transaction log resources*".

"uses fewer system and transaction log resources" = Operazione minimamente
loggata.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
tiriamoavanti
2008-03-18 18:19:49 UTC
Permalink
Post by tiriamoavanti
[e non dire: "ma la truncate non viene loggata" ;)]
Uh?
Ah ma io ero e sono assolutamente d'accordo con te sia qui che sopra!!!
Sottolineavo per convincere il Marco :)
alla prossima
Marco Bosco
2008-03-18 19:30:04 UTC
Permalink
Post by tiriamoavanti
Ah ma io ero e sono assolutamente d'accordo con te sia qui che sopra!!!
Sottolineavo per convincere il Marco :)
Il Marco è convinto :-; ...!!!

Ciao alla prx.

tiriamoavanti
2008-03-18 11:19:20 UTC
Permalink
Post by Lorenzo Benaglia
Sia Enterprise Manager che SQL Server Management Studio offrono una
procedura guidata semplicissima per ottenere questo file ed una volta
ottenuto puoi eliminare il db coi dati, ricreandolo "immacolato"
rieseguendo lo script.
http://msdn2.microsoft.com/en-us/library/ms178078.aspx
Il maghetto è molto comodo in alcune circostanze, ma ho due domande:

1) Si possono salvare i parametri inseriti (chessò, crea chiavi piuttosto
che inserisci drop ecc.) in modo da non nover ricominciare sempre da capo?

2) E' disponibile in SSIS? Non lo trovo... :(
Lorenzo Benaglia
2008-03-18 12:29:50 UTC
Permalink
Post by tiriamoavanti
1) Si possono salvare i parametri inseriti (chessò, crea chiavi
piuttosto che inserisci drop ecc.) in modo da non nover ricominciare
sempre da capo?
Cosa intendi con "in modo da non nover ricominciare sempre da capo"?
Comunque si, puoi includere constraints, indici, triggers, login, user
accounts, permission, ecc.
Post by tiriamoavanti
2) E' disponibile in SSIS? Non lo trovo... :(
Con SSIS volevi intendere SQL Server Management Studio (SSMS)? (i SSIS sono
gli Integration Services).
In SSMS seleziona il db, tasto DX, Tasks > Generate Scripts...

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
tiriamoavanti
2008-03-18 14:02:18 UTC
Permalink
Post by Lorenzo Benaglia
Cosa intendi con "in modo da non nover ricominciare sempre da capo"?
Comunque si, puoi includere constraints, indici, triggers, login, user
accounts, permission, ecc.
No, intendo dalla seconda volta. :) Io sono un programmatore, odio rifare le
cose...
Al primo giro va tutto bene, ma se voglio rigenerare lo script un'ulteriore
volta devo far girare il maghetto da capo... io vorrei poter salvare le
opzione di generazione e lanciarle con un semplice run.
Post by Lorenzo Benaglia
Post by tiriamoavanti
2) E' disponibile in SSIS? Non lo trovo... :(
Con SSIS volevi intendere SQL Server Management Studio (SSMS)? (
assolutamente no :)
il wizard citato richiede um mucchio di parametri (circa 20 solo per la
sezione "generale") ed è facilissimo dimenticarsene uno.
Io voglio memorizzare il tutto ed eseguirlo senza intervento utente.

SSIS che non conosco poteva essere una soluzione di esecuzione batch (con
output il ns. bel file .sql aggiornato); ma solo un'idea...
Lorenzo Benaglia
2008-03-18 14:10:48 UTC
Permalink
Post by tiriamoavanti
Al primo giro va tutto bene, ma se voglio rigenerare lo script
un'ulteriore volta devo far girare il maghetto da capo...
Ovvio, se hai fatto delle modifiche nello schema del db, come fai ad
aggiornare lo script se non riesegui l'esportazione?
Post by tiriamoavanti
io vorrei
poter salvare le opzione di generazione e lanciarle con un semplice
run.
Ti riferisci alle varie opzioni? Devi riselezionare quelle che ti servono...
Post by tiriamoavanti
il wizard citato richiede um mucchio di parametri (circa 20 solo per
la sezione "generale") ed è facilissimo dimenticarsene uno.
Io voglio memorizzare il tutto ed eseguirlo senza intervento utente.
Non puoi.
Post by tiriamoavanti
SSIS che non conosco poteva essere una soluzione di esecuzione batch
(con output il ns. bel file .sql aggiornato); ma solo un'idea...
Non puoi.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
tiriamoavanti
2008-03-18 14:16:55 UTC
Permalink
Post by Lorenzo Benaglia
Ovvio, se hai fatto delle modifiche nello schema del db, come fai ad
aggiornare lo script se non riesegui l'esportazione?
infatti voglio rieseguire l'esportazione...
Post by Lorenzo Benaglia
Ti riferisci alle varie opzioni? Devi riselezionare quelle che ti servono...
Eccoci!
Incredibile che non sia possibile salvare ed eseguire batch
l'esportazione... :(
Continua a leggere su narkive:
Loading...