web-dev-qa-db-ja.com

SQL Server 2005でトランザクションログの論理名を取得する方法

データベースの論理名に基づいてDBCC SHRINKFILEを使用してトランザクションログファイルを圧縮するT-SQLルーチンを記述しようとしています。 DB_NAME()関数は、データベースの論理名を提供します。トランザクションログに同等のものはありますか?そうでない場合、この情報を取得する他の方法はありますか?トランザクションログのデフォルト名は<<Database Name>>_log、しかし私はむしろこれに依存したくない。

24
DanM

以下を使用できます。

SELECT name
FROM sys.master_files
WHERE database_id = db_id()
  AND type = 1

ログファイルは、すべてのdatabase_idに対してtype = 1であり、すべてのデータベースのすべてのファイルはsys.master_filesにあります。

編集:

日常的にログを縮小するべきではないことを指摘しておきます。トランザクションログのサイズを適切に設定して、大きくならないようにし、そのサイズのままにする必要があります。トランザクションログをインスタントファイルで初期化することはできず、スペースが追加されたときにゼロにする必要があります。これは、低速の順次処理であり、パフォーマンスが低下します。

40

標準データベース(たとえば、1つのログファイルのみ)を想定すると、ログファイルは常にfile_id = 2です。これは、複数のデータファイルがある場合にも適用されます(NDFの場合はid = 3+)。

[〜#〜] dbcc [〜#〜] もファイルIDを取ります。したがって、DBCC SHRINKFILE (2...)は常に機能します。 DBCC内でパラメーター化できないため、動的SQLを回避できます。名前が必要な場合は、 FILE_NAME (2)を使用します。

14
gbn
select Name
from sys.database_files

生成、

SomeDb_Data  
SomeDb_Log

SqlServer 2012

5
SAm