Da dove iniziare a capire un database sconosciuto


12

Quindi, il titolo lo riassume.

Ho un database SQL Server con 28 tabelle e 86 stored procedure che devono essere decodificate. Sono abbastanza sicuro che alcuni tavoli non vengano mai utilizzati e che non vengano utilizzati anche tutti i proc.

Il problema più grande è che tutti i servizi Windows che sono stati creati per essere utilizzati con questo DB e tutta la documentazione del software e del database vanno persi e la persona che ha progettato l'intero sistema non si trova da nessuna parte.

Sono già riuscito a creare un diagramma ER per aiutarmi a capire le relazioni, ma poiché non ho esperienza nell'amministrazione del database, non ho idea di dove dovrei iniziare.

Inoltre mi dispiace se questo tipo di domanda non è destinato a essere posto qui.


1
Non seguo Hai pieno accesso al db e sai di avere 86 procedure di deposito per il reverse engineering. Quindi queste sono stored procedure crittografate? Di cosa hai esattamente bisogno per decodificare?
paparazzo,

Oh giusto. La tua domanda ha un senso: il db funziona, ma è un casino completo. Indici scadenti, tipi di dati errati, non normalizzati, e tutto sommato come una prestazione scadente ... Ma funziona.
Human_AfterTutti il

Assicurati di essere anche emotivamente preparato. Abbraccia e accetta la tua sfida. In caso contrario, si causerà attrito mentale per l'intero viaggio.
Christiaan Westerbeek,

Sicuro! Grazie per il consiglio! La preparazione emotiva è uno dei passaggi più (se non il più) importanti.
Human_AfterTutto il

Risposte:


5

Tre passaggi molto rapidi per iniziare:

1)

USE DatabaseName

SELECT    [TableName] = OBJECT_NAME(object_id),
last_user_update, last_user_seek, last_user_scan, last_user_lookup
FROM    sys.dm_db_index_usage_stats
WHERE    database_id = DB_ID('DatabaseName')

Ti dirà l'ultima volta che è stato utilizzato ciascun indice, incluso l'indice cluster. Quindi almeno darti un sapore per quali tabelle si accede (e quali no).

2) Attivare una sessione di eventi estesi (o traccia del profiler sul lato server se si esegue pre-SQL 2012) per circa un'ora mentre l'app viene utilizzata. Puoi anche chiedere a un utente di eseguire varie azioni nell'applicazione in un ordine specifico in modo da poterlo correlare con la traccia / sessione.

Un suggerimento utile: se è possibile modificare la stringa di connessione utilizzata dall'app, aggiungere "; Nome applicazione = AppNameGoesHere" in modo da poter eseguire un filtro di traccia su quel particolare Nome applicazione. Buone pratiche comunque.

3) Ottieni una versione dell'applicazione funzionante su un server non di produzione. Sviluppa un elenco di test basati sul comportamento per l'applicazione ("Quando l'utente fa clic sul pulsante Nuovo elemento, crea un nuovo elemento per quell'utente," ecc.) Inizia a eliminare gli oggetti che ritieni non abbiano alcun impatto sui test rinominandoli (Uso un formato come objectName_DEPRECATED_YYYYMMDD - con la data del giorno in cui prevedo di eliminarlo.) Verifica nuovamente tutti i tuoi test.

Attraverso una combinazione della sessione Eventi estesi, l'utilizzo dell'indice DMV e la cancellazione soft, si dovrebbe essere in grado di identificare gli oggetti principali utilizzati dall'applicazione e un buon consenso generale su quale oggetto fa cosa.

In bocca al lupo!


7

La soluzione migliore per iniziare è documentare il database utilizzando SQL Power Doc

Documentazione su SQL Server e Windows tramite Windows PowerShell

SQL Power Doc è una raccolta di script e moduli di Windows PowerShell che rilevano, documentano e diagnosticano le istanze di SQL Server e le relative configurazioni del sistema operativo e del computer Windows. SQL Power Doc funziona con tutte le versioni di SQL Server da SQL Server 2000 a 2014 e tutte le versioni di Windows Server e sistemi operativi Windows consumer da Windows 2000 e Windows XP a Windows Server 2012 R2 e Windows 8. SQL Power Doc è anche in grado di documentazione dei database SQL di Windows Azure.

Nota: l'ho usato e ti darà davvero un buon inizio nella documentazione e nella comprensione dell'istanza del tuo server di database.


Grazie. Questo aggiungerà sicuramente alla serie di passaggi che dovrò fare per capire questo dannato DB
Human_AfterAll

Hey! Sto davvero male con PowerShell e non ho potuto superare quel New-Item -type directory -path "$([Environment]::GetFolderPath([Environment+SpecialFolder]::MyDocuments))\WindowsPowerShell\Modules"passaggio sul SqlServerInventory ReadMe.txtfile. Non capisco dove devo inserire il percorso della cartella appena creata e dove devo inserire il nome della cartella appena creata.
Human_AfterTutti il

3

Dato che una volta mi trovavo in una situazione simile, posso dirti che questo sarà un lavoro difficile o impossibile. Avevo solo codice sorgente (> 100k righe di codice), il servizio in esecuzione, il database in esecuzione (~ 50 tabelle) e nessuna documentazione e nessuno a cui chiedere se non un utente di questa applicazione e una copia del database e dei servizi in esecuzione in un ambiente di test (che era in anticipo di alcuni numeri di versione ma senza codice sorgente). Un altro requisito era che i servizi dovevano essere eseguiti 24 ore su 24, 7 giorni su 7, perché erano esterni ai clienti. La situazione è nata perché la maggior parte del personale è partito all'incirca nello stesso momento, inclusi gli sviluppatori e la documentazione svanita nel caos. Mi ci sono voluti più di 6 mesi per ottenere una panoramica / documentazione approssimativa. C'erano molte tabelle e funzioni che non avevano alcun effetto perché erano per un uso futuro o mai completamente implementate, funzionalità difettose o obsolete o inedite. Dopo i 6 mesi ho dovuto riscrivere la documentazione perché ho scoperto cose nuove o relazioni tra le cose e prima avevo ipotesi errate.

Perché lo sto dicendo? Perché a volte in una situazione del genere è più facile ed economico iniziare da zero e scrivere una nuova applicazione che soddisfi i requisiti di quella precedente (o di quelli nuovi se sono cambiati nel tempo o si desidera una nuova versione principale). O per dirti cosa ti dovrai aspettare.

Se vuoi davvero decodificare, ti consiglierei i seguenti passaggi:

  • Fai un backup dell'intero sistema! (Primo: non saprai mai quando ne avrai bisogno. Secondo: Ne avrai bisogno per il passaggio successivo)
  • ricreare una copia del sistema (servizi e database) con cui lavorare e annotare come crearlo perché sicuramente dovrai farlo più volte nei prossimi mesi perché lo rovinerai più volte durante il reverse engineering
  • creare un diagramma ER con le dipendenze tra le tabelle
  • visualizzare e documentare le dipendenze di ogni tabella, stored procedure, ... perché queste non sono per lo più incluse nei diagrammi ER
  • capire cosa dovrebbe fare il software chiedendo agli utenti e utilizzandolo da solo (meglio farlo sul sistema di test)
  • Se il codice sorgente dei servizi è disponibile: ottenere una panoramica di esso e chiamare il DB e documentarlo (doxygen è un buon strumento per ottenere una documentazione approssimativa con gerarchie di chiamate di funzione)
  • prova ad avere una visione d'insieme del DB guardando i tablenames e le loro colonne
  • guarda il database mentre lo usi
  • con i precedenti 4 passaggi dividere le tabelle in 3 categorie (potrebbe differire a seconda della propria applicazione): dati statici (dati che non cambiano durante l'esecuzione del server come configurazione del server, enum per limitare i valori validi in altre tabelle usando chiavi esterne ad esso , ...), dati di configurazione (dati che cambiano raramente come le impostazioni utente, ...) e dati OLTP (messaggi utente nel server di chat, post in un forum, valori di misurazione in un sistema di controllo della macchina, battaglie in un gioco online, ...)
  • ripetere i precedenti 5 passaggi fino a quando non si è soddisfatti o si rinuncia
  • Documento e codice come se il ragazzo che finisce per mantenere il TUO codice / sistema / database sarà uno psicopatico violento che sa dove vivi.

Ti auguro buona fortuna ;)


1
-1, Chiunque pensi che sia "più facile ed economico iniziare da zero e riscrivere tutto" di un'applicazione di grandi dimensioni non ha mai dovuto farlo. Questo è un consiglio amatoriale.
BlueRaja - Danny Pflughoeft il

@ BlueRaja-DannyPflughoeft Dipende dal tipo, dalle dimensioni e dallo stato dell'applicazione e dai requisiti di compatibilità con le versioni precedenti. Ho riscritto un'applicazione da zero con circa 100k LoC. Non era necessario imitare l'originale, ma è stato rilasciato come una nuova versione principale con alcune nuove funzioni aggiunte, alcune vecchie funzioni rimosse, un'interfaccia utente modernizzata e la possibilità di utilizzare i vecchi dati. Il codice originale era un tale disastro e un disastro di sicurezza che eravamo più veloci del tempo stimato per ripulire il vecchio codice.
H. Idden,

Soprattutto se il codice contiene molte soluzioni alternative prive di documenti, è successo spesso che un piccolo cambiamento si sia schiantato su qualcosa di totalmente totalmente indipendente. Ma sono d'accordo con te, sul fatto che molti sottovalutano il costo (manodopera, denaro, ...) di farlo da zero perché non conoscono o sottovalutano tutti i requisiti dell'applicazione, soprattutto quando è cresciuta e cambiata nel corso degli anni.
H. Idden,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.