Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [SQLSERVER 8] Creare procedura per eliminazione vincoli e relazioni

    Ciao ragazzi

    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:
    codice:
    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

    05.08.2005 - by alka
    Auguri all'angelo custode dei moderatori.

  2. #2
    possibile che nessuno abbia un'idea?
    please...

    05.08.2005 - by alka
    Auguri all'angelo custode dei moderatori.

  3. #3

    esportati tutte le tabelle senza esportarti le relazioni con i tool di sqlserver

  4. #4
    Originariamente inviato da kentaromiura

    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:

    05.08.2005 - by alka
    Auguri all'angelo custode dei moderatori.

  5. #5
    Ho risolto il problema e visto che potrebbe essere utile a qualcuno posto qui il codice corretto.
    codice:
    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

    05.08.2005 - by alka
    Auguri all'angelo custode dei moderatori.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.