PDA

Visualizza la versione completa : [SQLSERVER 8] Creare procedura per eliminazione vincoli e relazioni


ladyBlu
16-01-2006, 10:22
Ciao ragazzi :D

Ho la necessità di creare uno script di sql che elimini in automatico tutte le relazioni, i vincoli e le chiavi delle tabelle di un dato database.
Questo perchè ho poi la necessità di effettuare delle modifiche alle colonne di alcune tabelle.
Lo so, sarebbe più facile farlo a mano, ma purtroppo devo creare un tool di manutenzione dei database e quindi necessito di procedure.
Al momento ho scritto questo:


USE 'Sitt2_Sud_ConfigurationDB'

-- creare array con elenco tabelle
-- creare array con elenco indice tabella
-- cancellare ogni elemento del precedente array


-- creo l'array e lo riempio con i nomi delle tabelle

DECLARE @table_name VARCHAR(50) = ''
DECLARE @index_name VARCHAR(255) = ''

DECLARE table_cursor CURSOR LOCAL FAST_FORWARD FOR
--legge i nomi delle tabelle
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE (TABLE_TYPE not like 'view%') AND
(TABLE_NAME NOT IN(select TABLE_NAME FROM
INFORMATION_SCHEMA.TABLE_PRIVILEGES))FOR READ ONLY

OPEN table_cursor
FETCH table_cursor INTO @table_name
WHILE (@@fetch_status <> -1)
BEGIN
-- creo ed eseguo il ciclo sugli indici
DECLARE index_cursor CURSOR FOR
EXEC sp_helpindex '@table_name'

OPEN index_cursor
FETCH table_cursor INTO @index_name
WHILE (@@fetch_status <> -1)
BEGIN
DROP INDEX @table_name.@index_name
END

-- mi sposto sulla tabella successiva
FETCH table_cursor INTO @table_name

CLOSE index_cursor
DEALLOCATE index_cursor

END

CLOSE table_cursor
DEALLOCATE table_cursor

Ho in particolare 2 problemi.

Effettuo una select per caricare un cursore contenente l'elenco di tutte le tabelle presenti nel database.
Avvio il ciclo su questo cursore e ad ogni giro carico un nuovo cursore contenente l'elenco degli indici relativi alla suddetta tabella.

- Primo problema: l'istruzione che utilizzo per leggere l'elenco degli indici è: sp_helpindex '@table_name' (in rosso nel codice postato)
Il problema è che ovviamente non è possibile eseguire una stored procedure così come l'ho scritta io; anzi, non so nemmeno se sia possibile farlo all'interno di un ciclo.
Qualora però sbagliassi non conosco la sintassi, quindi la mia prima domanda è: esiste una sintassi corretta x eseguire questa istruzione o un'altra istruzione equivalente?

- Secondo problema che mi si pone è l'eliminazione dell'indice trovato.
L'istruzione che utilizzo è la DROP INDEX alla quale passo le variabili contenenti il nome della tabella e il nome dell'indice: DROP INDEX @table_name.@index_name (in rosso nel codice postato).
Chiaramente non funziona, e non so perchè. Anche qui, sbaglio a scrivere qualcosa o il problema è altrove?


Grazie a tutti
lady :ciauz:

ladyBlu
16-01-2006, 14:42
possibile che nessuno abbia un'idea?
please... :)

kentaromiura
17-01-2006, 07:55
:D
esportati tutte le tabelle senza esportarti le relazioni con i tool di sqlserver

ladyBlu
17-01-2006, 10:58
Originariamente inviato da kentaromiura
:D
esportati tutte le tabelle senza esportarti le relazioni con i tool di sqlserver kenta, ti ringrazio per la geniale idea... ma non è ciò che mi serve. lo script lo devo fare io e deve cancellare e ricreare come dico io :rollo:

ladyBlu
17-01-2006, 17:30
Ho risolto il problema e visto che potrebbe essere utile a qualcuno posto qui il codice corretto.


USE nome_database

DECLARE @table_name sysname
DECLARE @index_name sysname

-- creo ed eseguo il ciclo sulle tabelle
DECLARE table_cursor CURSOR LOCAL FAST_FORWARD FOR
--legge i nomi delle tabelle
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE (TABLE_TYPE not like 'view%') AND
(TABLE_NAME NOT IN(select TABLE_NAME FROM
INFORMATION_SCHEMA.TABLE_PRIVILEGES))FOR READ ONLY

OPEN table_cursor
FETCH table_cursor INTO @table_name
WHILE (@@fetch_status <> -1)
BEGIN
-- creo ed eseguo il ciclo sugli indici
DECLARE index_cursor CURSOR FOR
SELECT sysindexes.name
FROM sysobjects, sysindexes,
INFORMATION_SCHEMA.TABLES
WHERE
INFORMATION_SCHEMA.TABLES.TABLE_NAME = sysobjects.name
AND sysobjects.[id] = sysindexes.[id]
AND sysobjects.name IN (SELECT TABLE_NAME FROM
INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE NOT LIKE 'view%')
AND sysindexes.indid <> 255
AND sysindexes.indid <> 0
AND sysindexes.status > 0
AND sysobjects.status > 0
AND NOT sysindexes.rowmodctr < 0
AND INFORMATION_SCHEMA.TABLES.TABLE_NAME = @table_name
ORDER BY sysindexes.name, sysindexes.status

OPEN index_cursor
FETCH index_cursor INTO @index_name
WHILE (@@fetch_status <> -1)
BEGIN
EXEC('Drop index ' + @table_name + '.' + @index_name)
-- mi sposto sull'indice successivo
FETCH NEXT FROM index_cursor INTO @index_name
END

CLOSE index_cursor
DEALLOCATE index_cursor

-- mi sposto sulla tabella successiva
FETCH NEXT FROM table_cursor INTO @table_name
END

CLOSE table_cursor
DEALLOCATE table_cursor


spero possa essere utile.

ciao a tutti
lady :ciauz:

Loading