Modifica accidentale del nome del database (SQL Server 2008)


8

ANCORA non è successo a me. Ma stavo pensando a questo.

Stavo scherzando con il mio ambiente di allenamento, e per errore ho cliccato sul nome del database e poi ho toccato la lettera A.

Astuccio

Supponiamo che io prema invio. Ora il database si chiama A e non ricordo il nome originale. CTRL + Z non funziona.

case2

Cosa fare in un caso come questo, in un ambiente di produzione?

So che non potrebbe accadere, perché il database non è impostato come UTENTE SINGOLO. Ma se succede. Cosa fare? Per amor di argomenti, supponiamo che sia un database che nessuno sta usando in questo momento.


2
Avrei un utente specifico con ALTER DATABASEautorizzazioni e accederei come quell'utente quando in realtà voglio eseguire uno ALTER DATABASEscript. In questo modo non farai mai quanto sopra
Mark Sinkinson il

Risposte:


12

Fai clic destro sul database, vai ai file. Puoi vedere i nomi dei file originali. Questo ti aiuterà a trovare facilmente il nome corretto del database. I nomi dei file non verranno modificati con una ridenominazione.

Puoi anche provare a dare un'occhiata al tuo fn_dblog. Non è documentato ma puoi vedere (e filtrare) le ultime azioni.

SELECT * 
FROM fn_dblog(NULL,NULL)

2
I dati non vengono visualizzati da questa query in testo semplice. Avrebbe bisogno di lanciarlo in una forma leggibile con qualcosa del genereSELECT CAST([RowLog Contents 0] AS sysname) ,CAST([RowLog Contents 1] AS sysname) FROM sys.fn_dblog(NULL,NULL) WHERE Context = 'LCX_BOOT_PAGE' AND [Offset in Row] =52
Martin Smith,

7

Dubito che avresti un database in produzione il cui nome non conosci o non lo hai documentato da qualche parte.

Se in caso accada durante la produzione, è possibile cercare l'elenco dei backup esistenti utilizzando

RESTORE HEADERONLY FROM DISK = '<backuplocation>' 

O utilizzare dbo.backupsetda msdb.

SELECT DISTINCT database_name FROM msdb.dbo.backupset

5

È possibile esaminare i registri di SQL Server per l'ultima volta che SQL Server è stato avviato e cercare ogni istanza di "Nome database" di avvio del database. È quindi possibile confrontare questo elenco con i risultati di database sys. Eventuali nuovi database e quello modificato non saranno nell'elenco dei registri di SQL Server.

Un altro modo forse migliore sarebbe quello di interrogare la traccia e il filtro predefiniti tramite il database_id :: fn_trace_gectable. Supponendo che vi sia stato un utilizzo recente del DB, la colonna databaseName mostrerà il vecchio nome e quindi in una riga più recente il nuovo nome con un tipo di evento Object: Altered.

SELECT  *
        ,cast(value as nvarchar(1000))
FROM   ::fn_trace_getinfo(default)
WHERE   traceid = 1 and   property = 2;

SELECT  ftg.StartTime,
        ftg.EndTime,
        te.name,
        ftg.sessionLoginName,
        ftg.ObjectName,
        ftg.DatabaseName,
        ftg.ServerName,
        ftg.LoginName,
        ftg.hostName,
        ftg.NTUserName,
        ftg.DatabaseID,
        ftg.TextData,
        ftg.TargetuserName
        ,SPACE(10) AS [Space]
        ,*
FROM    ::fn_trace_gettable('Z:\SQLServer\MSSQL\Log\log_5.trc', default) AS ftg 
INNER JOIN
        sys.trace_events AS te 
        ON  ftg.EventClass = te.trace_event_id  
ORDER BY
        ftg.StartTime DESC
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.