none
Ricerca di constraint su tutto il database (SQL Server 2000) RRS feed

  • Domanda

  • Ciao a tutti,
    dovrei ricercare la presenza di una costraint ('PK_#legendaStato_Stato') su tutto il database.
    Questo però è composto da oltre 800 tabelle. E' un db SQL Server 2000.
    C'è modo, tramite qualche vista di sistema, di ottenere questo risultato in maniera veloce?

    Grazie

    Luigi

    venerdì 30 aprile 2010 08:59

Risposte

  • dovrei ricercare la presenza di una costraint ('PK_#legendaStato_Stato') su tutto il database.
    Questo però è composto da oltre 800 tabelle. E' un db SQL Server 2000.
    C'è modo, tramite qualche vista di sistema, di ottenere questo risultato in maniera veloce?

    Ciao Luigi,

    Puoi interrogare la tabella di sistema sysconstraints:  

    SELECT OBJECT_NAME(constid) AS NomePK, OBJECT_NAME(id) AS NomeTabella
    FROM sysconstraints
    WHERE constid = OBJECT_ID(N'PK_#legendaStato_Stato');
    Ciao!
    Lorenzo Benaglia
    Microsoft MVP - SQL Server
    http://blogs.dotnethell.it/lorenzo
    http://social.microsoft.com/Forums/it-IT/sqlserverit
    • Contrassegnato come risposta Ciupaz venerdì 30 aprile 2010 09:46
    venerdì 30 aprile 2010 09:15
    Moderatore
  • Errore nella lettura dei dati:
    Impossibile elaborare la richiesta. ---> There is already an object named 'PK_#legendaStato_Stato' in the database. Could not create constraint.
    See previous errors

    Come è possibile risolvere?

    In un database non possono esistere 2 constraints con lo stesso nome.

    Il problema puoi risolverlo facendo in modo che sia SQL Server ad assegnare un nome "random" al constraint, specificando Stato tinyint not null PRIMARY KEY direttamente nel comando di CREATE TABLE.

    Al termine dell'esecuzione della SP la tabella temporanea locale verrà automaticamente eliminata insieme a tutti i suoi constraints.

    Ciao!


    Lorenzo Benaglia
    Microsoft MVP - SQL Server
    http://blogs.dotnethell.it/lorenzo
    http://social.microsoft.com/Forums/it-IT/sqlserverit
    • Contrassegnato come risposta Ciupaz venerdì 30 aprile 2010 09:46
    venerdì 30 aprile 2010 09:37
    Moderatore

Tutte le risposte

  • dovrei ricercare la presenza di una costraint ('PK_#legendaStato_Stato') su tutto il database.
    Questo però è composto da oltre 800 tabelle. E' un db SQL Server 2000.
    C'è modo, tramite qualche vista di sistema, di ottenere questo risultato in maniera veloce?

    Ciao Luigi,

    Puoi interrogare la tabella di sistema sysconstraints:  

    SELECT OBJECT_NAME(constid) AS NomePK, OBJECT_NAME(id) AS NomeTabella
    FROM sysconstraints
    WHERE constid = OBJECT_ID(N'PK_#legendaStato_Stato');
    Ciao!
    Lorenzo Benaglia
    Microsoft MVP - SQL Server
    http://blogs.dotnethell.it/lorenzo
    http://social.microsoft.com/Forums/it-IT/sqlserverit
    • Contrassegnato come risposta Ciupaz venerdì 30 aprile 2010 09:46
    venerdì 30 aprile 2010 09:15
    Moderatore
  • Grazie Lorenzo per la celere risposta.
    Ti aggiungo qua sotto la continuazione del problema, di cui questo post era solo l'inizio.

    In una applicazione web che esegue dei report, viene lanciata in contemporanea una stored procedure al cui interno viene creata una tabella temporanea con questa istruzione:

    CREATE TABLE #legendaStato (Colonna int,
       Descrizione varchar(30),
       Colore varchar(30),        
       Stato tinyint not null) ON [PRIMARY]

    ALTER TABLE #legendaStato WITH NOCHECK ADD
     CONSTRAINT [PK_#legendaStato_Stato] PRIMARY KEY  CLUSTERED
     (
       Stato
     )  ON [PRIMARY]


    si verifica però un problema di contemporaneità, ed infatti l'applicazione va in errore restituendo il seguente messaggio:

    Errore nella lettura dei dati:
    Impossibile elaborare la richiesta. ---> There is already an object named 'PK_#legendaStato_Stato' in the database. Could not create constraint.
    See previous errors

    Come è possibile risolvere?

    PS
    Dimmi tu se è meglio che apra un nuovo post o posso aggiungermi sempre a questo.

    Grazie

    Luigi

     

    venerdì 30 aprile 2010 09:22
  • Errore nella lettura dei dati:
    Impossibile elaborare la richiesta. ---> There is already an object named 'PK_#legendaStato_Stato' in the database. Could not create constraint.
    See previous errors

    Come è possibile risolvere?

    In un database non possono esistere 2 constraints con lo stesso nome.

    Il problema puoi risolverlo facendo in modo che sia SQL Server ad assegnare un nome "random" al constraint, specificando Stato tinyint not null PRIMARY KEY direttamente nel comando di CREATE TABLE.

    Al termine dell'esecuzione della SP la tabella temporanea locale verrà automaticamente eliminata insieme a tutti i suoi constraints.

    Ciao!


    Lorenzo Benaglia
    Microsoft MVP - SQL Server
    http://blogs.dotnethell.it/lorenzo
    http://social.microsoft.com/Forums/it-IT/sqlserverit
    • Contrassegnato come risposta Ciupaz venerdì 30 aprile 2010 09:46
    venerdì 30 aprile 2010 09:37
    Moderatore
  • Grazie mille Lorenzo, ottima soluzione.
    Infatti non capivo bene perchè era stata seguita questa strada di aggiungere a posteriori, con un Alter Table, la PK alla tabella temporanea.

    Luigi

    venerdì 30 aprile 2010 09:46