Sto tentando di scrivere una routine T-SQL che compatta il file di registro delle transazioni utilizzando DBCC SHRINKFILE in base al nome logico del database. La funzione DB_NAME()
fornisce il nome logico del database. Ce n'è uno equivalente per il log delle transazioni? In caso contrario, c'è un altro modo per ottenere queste informazioni? Il nome predefinito per i registri delle transazioni è <<Database Name>>_log
, ma preferirei non fare affidamento su questo.Come ottenere il nome logico del log delle transazioni in SQL Server 2005
risposta
È possibile utilizzare: i file
SELECT name
FROM sys.master_files
WHERE database_id = db_id()
AND type = 1
Login hanno type = 1 per qualsiasi database_id e tutti i file per tutti i database può essere trovato in sys.master_files.
EDIT:
Tengo a precisare che non si dovrebbe essere restringendo il registro su una base sistematica. Il registro delle transazioni deve essere dimensionato in modo appropriato per evitare che debba sempre crescere e quindi lasciato a quella dimensione. Il log delle transazioni non può essere il file istantaneo inizializzato e deve essere azzerato quando lo spazio viene aggiunto, che è un'operazione sequenziale lenta che degrada le prestazioni.
Assumendo un database standard (ad esempio, un solo file di registro), il file di registro è sempre file_id = 2. Ciò vale anche se si dispone di più file di dati (id = 3+ per NDF).
Anche lo DBCC accetta l'id del file. Quindi, DBCC SHRINKFILE (2...)
funzionerà sempre. Non è possibile parametrizzare all'interno del DBCC in modo da evitare l'SQL dinamico. Se si desidera il nome, utilizzare FILE_NAME (2).
select Name
from sys.database_files
Genera,
SomeDb_Data
SomeDb_Log
SqlServer 2012
ps. Si noti che diversi database sulla stessa istanza possono utilizzare lo stesso nome di registro. Come risultato oltre a mettere 'DBCC SHRINKFILE ('log log name', size)' dovresti prima mettere 'use [MyDatabase] 'per assicurarti di lavorare nel DB giusto. – JohnLBevan