Ricreare tabella da applicazione

mercoledì 11 agosto 2010 - 11.52
Tag Elenco Tags  C#  |  VB.NET  |  .NET 3.5  |  Visual Studio 2008  |  SQL Server 2008

the_angel Profilo | Newbie

Ciao,
Per esigenze professionali, devo completare un programma in c#, framework 3.5.

Praticamente fa nell'ordine:

1)legge i campi di una tabella
2)distrugge la tabella
3)ricrea la tabella

Ho aggiunto uno step per leggere gli indici della tabella con: exec sp_helpindex [nomeTabella]
estraggo tutti i campi, nome indice, tipo ecc e lo ricreo correttamente.
Funziona...

Ma provando a far generare dal management studio lo script per la creazione degli indici,
ci sono in più (rispetto a quello che scrivo io a manina dal programma) queste istruzioni...
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

Come faccio a ottenerle?
la sp_helpindex mi restituisce solo nome indice, tipo e campi coinvolti.....

Oppure, se non si possono ottenere, c'è modo da un'applicazione dot net,
di interrogare sql server (ver 2008) e farsi resituire lo script di creazione?

grazie mille a chi avrà la pazienza di leggere!

Angelo

alx_81 Profilo | Guru

>Ciao,
Ciao

>Ma provando a far generare dal management studio lo script per la creazione degli indici,
>ci sono in più (rispetto a quello che scrivo io a manina dal programma) queste istruzioni...
>WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB
>= OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF,
>ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

>Come faccio a ottenerle?
Ti consiglio di utilizzare SMO, che è valido in generale per tutti gli oggetti sql server.
Prendendo spunto da questo mio post (http://blogs.dotnethell.it/suxstellino/Classe-Sql-Server-Management-Objects-SMO-per-la-gestione-degli-oggetti-di-un-database__11662.aspx) puoi capire un pochino di più di cosa si tratta.
Detto questo, ho trovato su questo post (http://blogs.lessthandot.com/index.php/DataMgmt/DBAdmin/MSSQLServerAdmin/smo-script-index-and-fk-s-on-a-database) quello che potrebbe servirti, sempre con SMO.

>grazie mille a chi avrà la pazienza di leggere!
di nulla!
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

the_angel Profilo | Newbie

Ciao,
grazie della tempestiva risposta.

Ho omesso che avevo già trovato quella soluzione (leggendo il tuo post)....
Ho googlato ancora un po', ma non è un po' lento?

Il db è di grosse, grosse dimensioni....e le tabelle sono tante...
Non c'è altro sistema?

in ogni caso, grazie comunque per l'interessamento...
Angelo

alx_81 Profilo | Guru

>Ho googlato ancora un po', ma non è un po' lento?
SSMS (Sql Server Management Studio) si basa su quello e usa regolarmente quello. La classe è stata resa utilizzabile proprio per i vantaggi che dà nella gestione.
Sinceramente non so quanto possa essere molto più veloce una soluzione a mano sulle tabelle del catalog..

>Il db è di grosse, grosse dimensioni....e le tabelle sono tante... Non c'è altro sistema?
se usi lo schema sys, hai la tabella sys.indexes che ha le informazioni che ti servono.

Ma una domanda, per una tabella hai bisogno di prestazioni esagerate? Oppure hai paura di dover ripetere l'operazione troppe volte? Non credo che SMO sia così peggio di una soluzione amanuense. Ma posso anche sbagliarmi, non ho mai avuto a che fare con questo tipo di soluzione. Il mio caso reale è stato:
- un database con una ottantina di tabelle e almeno altrettanto indici (ovviamente sono di più, ne avevo anche di nonclustered)
- fk relative

dovevo generare il codice vb.net partendo dal modello db e creare la classe.vb con tanto di metodi crud, passando oltretutto da un'interfaccia windows forms.
A me pareva andasse benone
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

the_angel Profilo | Newbie

grazie delle info...
Non sapevo che fosse la stessa classe del SSMS.

Comunque no, la tabella è non è una, ma molte.
Il programma legge da un file l'elenco delle tabelle
e dei campi,droppa, ri-crea, crea gli indici, crea ed esegue un DTS che fa l'importazione dei dati.
Il tutto per N tabelle...

Comunque proverò eventualmente a riscriverlo usando SMO più avanti,
di sicuro facilita il lavoro :-)

Già che ci sono volevo chiederti un'altra cosa...
Creo un package per l'importazione, da codice...fa tutto...
unica cosa, quando lo eseguo, non ha la password per accedere al
db, e giustamente va in errore...

// Creo l'ole db di destinazione
IDTSComponentMetaData100 destination = dataFlowTask.ComponentMetaDataCollection.New();
destination.ComponentClassID = "DTSAdapter.OleDbDestination";
// Create the design-time instance of the destination.
CManagedComponentWrapper destDesignTime = destination.Instantiate();
// The ProvideComponentProperties method creates a default input.
destDesignTime.ProvideComponentProperties();

//Assegno le proprietà al source di DESTINAZIONE
destDesignTime.SetComponentProperty("AccessMode", 0);
destDesignTime.SetComponentProperty("OpenRowset", strTabellaDestinazione);

Quì provo a settagli la propery password, ma va in errore...
mi dice che la proprietà non è riconosciuta...
destDesignTime.SetComponentProperty("Password", "passwordDatabase");

Dove sbaglio?

grazie della disponibilità....
Angelo

alx_81 Profilo | Guru

>Comunque no, la tabella è non è una, ma molte.
>Il programma legge da un file l'elenco delle tabelle
>e dei campi,droppa, ri-crea, crea gli indici, crea ed esegue
>un DTS che fa l'importazione dei dati.
>Il tutto per N tabelle...
ma la lentezza è allora anche la ricostruzione dell'indice non è smo.. hai drop, create, build dell'indice, ecc.. la lentezza non può essere smo non trovi?

>Già che ci sono volevo chiederti un'altra cosa...
>Creo un package per l'importazione, da codice...fa tutto...
>unica cosa, quando lo eseguo, non ha la password per accedere
>al db, e giustamente va in errore...
Hai creato il connection manager come nell'esempio qui sotto?
http://msdn.microsoft.com/en-us/library/ms136020.aspx


--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

the_angel Profilo | Newbie

>>Comunque no, la tabella è non è una, ma molte.
>>Il programma legge da un file l'elenco delle tabelle
>>e dei campi,droppa, ri-crea, crea gli indici, crea ed esegue
>>un DTS che fa l'importazione dei dati.
>>Il tutto per N tabelle...
>ma la lentezza è allora anche la ricostruzione dell'indice non
>è smo.. hai drop, create, build dell'indice, ecc.. la lentezza
>non può essere smo non trovi?

Si, pensandoci un attimo....

>
>>Già che ci sono volevo chiederti un'altra cosa...
>>Creo un package per l'importazione, da codice...fa tutto...
>>unica cosa, quando lo eseguo, non ha la password per accedere
>>al db, e giustamente va in errore...
>Hai creato il connection manager come nell'esempio qui sotto?
>http://msdn.microsoft.com/en-us/library/ms136020.aspx
>
Esattamente uguale...l'unica cosa che cambia è che metto anche la
password nella connection string...solo che quando riapro il sis, e apro
la connessione non c'è...non capisco...

L'errore che mi da il sis generato, quando lo apro :

TITLE: Package Validation Error
------------------------------

Package Validation Error

------------------------------
ADDITIONAL INFORMATION:

Error at {41BA509D-69F5-4DFE-BE46-CC7D60BE06EB} [OLE DB Destination [94]]: SSIS Error Code DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER. The AcquireConnection method call to the connection manager "Destinazione dati" failed with error code 0xC0202009. There may be error messages posted before this with more information on why the AcquireConnection method call failed.

Error at {41BA509D-69F5-4DFE-BE46-CC7D60BE06EB} [SSIS.Pipeline]: component "OLE DB Destination" (94) failed validation and returned error code 0xC020801C.

Error at {41BA509D-69F5-4DFE-BE46-CC7D60BE06EB} [SSIS.Pipeline]: One or more component failed validation.

Error at {41BA509D-69F5-4DFE-BE46-CC7D60BE06EB}: There were errors during task validation.

Error at {ECBD7F5E-3B07-4124-A2CA-B9788D30F33B} [Connection manager "Destinazione dati"]: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80004005.
An OLE DB record is available. Source: "Microsoft OLE DB Provider for ODBC Drivers" Hresult: 0x80004005 Description: "[Microsoft][Driver Manager ODBC] Nome origine dati non trovato e driver predefinito non specificato.".

(Microsoft.DataTransformationServices.VsIntegration)


Se metto la password a mano, però , funziona perfettamente.....



>
>--
>Alessandro Alpi | SQL Server MVP
>MCP|MCITP|MCTS|MCT
>
>http://www.alessandroalpi.net
>http://blogs.dotnethell.it/suxstellino
>http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Angelo

alx_81 Profilo | Guru

>Esattamente uguale...l'unica cosa che cambia è che metto anche la
>password nella connection string...solo che quando riapro il
>sis, e apro la connessione non c'è...non capisco...
ah adesso ho capito. Quando lo riapri a mano è normale che non vada, a meno che non crei il pacchetto protetto in qualche modo.
Se tu lasci il package non criptato nelle credenziali, quando lo riapri perdi il binding con le pwd e gli user che hai messo.
Bisogna settare la proprietà EncryptionLevel ad un livello (come ad esempio protezione con password) sufficiente per memorizzare i tuoi dati.

Per maggiori info qui: http://msdn.microsoft.com/en-us/library/ms141747.aspx


--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

the_angel Profilo | Newbie

Grazie della pazienza...e del tempo....

Non avevo letto l'articolo...ho provato con tutti i livelli, ma non si salva la password.
E' nella stringa di connessione...ma quando riapro il package (e mi chiede la pass impostata),
restituisce il medesimo errore.

Ho aperto l'xml generato con un editor, e nella stringa di connessione la password non c'è...
Provo a metterla a mano, salvo, riapro con visual studio, e non c'è la vede comunque....

Debuggando vedo che gli passo la stringa di connessione con la password, ma alla riga
successiva la password non c'è...è come se la ignorasse...


Angelo

alx_81 Profilo | Guru

>Debuggando vedo che gli passo la stringa di connessione con la
>password, ma alla riga successiva la password non c'è...è come se la ignorasse...
non mostrare quella password è un livello di sicurezza in più.
Prova a fare un package, anche vuoto ma con almeno un connection manager e credenziali sql per la connessione, metti il livello di protezione a EncryptSensitiveWithPassword. Immetti la tua password e prova a chiudere il package salvandolo. Riaprilo e metti la password quando richiesta. In quel caso i dati dovrebbero essere persistiti.
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5