如何在SQL Server中获取* actual * default数据库位置?

时间:2010-08-22 04:34:23

标签: sql-server-2005 scripting configuration

在SQL Server Management Studio中,可以选择为给定实例设置默认数据库路径:

alt text

这很有效。当我说

CREATE DATABASE test

它在我指定的路径E:\data中创建。大。

但是如何在T-SQL中获取此路径(用于设置脚本)?

Contrarymany pages sayDefaultDataDefaultLog没有注册表项(在我的计算机上)。我在XP 64上运行SQL Server 2005 Express。

此值必须存储在某处。在哪里?

4 个答案:

答案 0 :(得分:6)

您是否可以访问SQL事件探查器?

我没有安装SQL 2005 Express但是当我在运行Profiler的机器上查看该属性页面时,我可以看到SQL Server从我的SQL 2008实例上检索它的位置。

declare @SmoDefaultFile nvarchar(512)

exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', 
 N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultData', 
  @SmoDefaultFile OUTPUT

select ISNULL(@SmoDefaultFile,N'') AS [DefaultFile]

编辑:以上内容对我来说也适用于SQL Server 2005 Developer Edition,但只有在我将默认路径更改为默认路径以外的其他路径之后。

答案 1 :(得分:2)

使用SYS.DATABASE_FILES

SELECT df.physical_name
  FROM SYS.DATABASE_FILES df

SYS.DATABASE_FILES.type_desc

  • ROWS = mdf位置,包括mdf文件名
  • LOG = ldf location,包括ldf filename

答案 2 :(得分:1)

我这样做了。该示例适用于任何数据库。当您不确定代码中的默认位置时,您始终可以创建一个新的临时数据库并在使用此脚本后删除:

Scanner stdin = new Scanner(System.in);

System.out.print("Enter a and b numbers between the interval [-128,127] (-1 -1 to exit): ");

String inputString = stdin.nextLine();

String[] inputArray = inputString.split(" ");

byte a = Byte.parseByte(inputArray[0]);
byte b = Byte.parseByte(inputArray[1]);

或者:

DECLARE @databasetocheck AS nvarchar(128) = 'AnotherTestDb'
SELECT  '[' + @@SERVERNAME + ']' AS [Server Name],
        [sdb].[name] AS [Database Name],
        [saf].[name] AS [Logical File Name],
        [saf].[filename] AS [Full path and name],
        LEFT([saf].[filename], (LEN([saf].[filename]) - LEN(REVERSE(LEFT(REVERSE([saf].[filename]), CHARINDEX('\', REVERSE([saf].[filename])) -1))))) AS [File Location],
        LEFT(RIGHT([saf].[filename], (LEN(REVERSE(LEFT(REVERSE([saf].[filename]), CHARINDEX('\', REVERSE([saf].[filename])) -1))))), CHARINDEX('.', RIGHT([saf].[filename], (LEN(REVERSE(LEFT(REVERSE([saf].[filename]), CHARINDEX('\', REVERSE([saf].[filename])) -1))))))-1)AS [Physical File Name],
        RIGHT([saf].[filename], (LEN(REVERSE(LEFT(REVERSE([saf].[filename]), CHARINDEX('.', REVERSE([saf].[filename])) -1))))) AS [File Extension]
FROM    [master].[dbo].[sysaltfiles] [saf], [master].[dbo].[sysdatabases] [sdb]
WHERE   [saf].[dbid] = [sdb].[dbid]
AND     [sdb].[name] = @databasetocheck
GO
祝你好运!

答案 3 :(得分:0)

正如OP指出的那样,DefaultFile / DefaultLog注册表值并不总是存在(例如,如果它们自初始安装后尚未重新配置)。在这种情况下,行为似乎是相对于主db / log文件所在的路径创建数据库/日志。

通过SMO

考虑到这一点,我总是使用SMO(通过PowerShell)并使用.DefaultFile或者.MasterDbPath Server上的$smoServer = new-object Microsoft.SqlServer.Management.Smo.Server $sqlServer $str = $smoServer.DefaultFile if ($str) { $str; }else{ $smoServer.MasterDBPath; } ,例如:

CREATE DATABASE blah

(有关完整脚本,请参阅https://gist.github.com/piers7/d8f4a75232e5983f7f5b

通过注册表

如果你想直接点击注册表,我认为这不是相当,因为我认为masterdb路径只是通过服务参数公开,而不是作为其中的专用密钥自己的权利(可能是错的:从来没有真正追求过这么多)。

通过TSQL

在TSQL中,似乎没有特别干净的方法(使用xp_instance_regread需要SA权限,例如,不仅仅是db_datacreator - 请参阅https://connect.microsoft.com/SQLServer/feedback/details/515132/management-studio-generates-scripts-that-use-unsupported-undocumented-procedures)。

然而,这里真正简单的选择就是使用

CREATE DATABASE [$(databaseName)
ALTER DATABASE [$(databaseName)] MODIFY FILE ( NAME = N'$(databaseName)', SIZE = 204800KB )

...让默认设置自己完成!如果您只需要路径以便可以同时创建数据库设置文件大小/增长,那么您可以随时更改数据库,然后立即实现同样的事情:

{{1}}

......无需担心所有路径