【问题标题】:CREATE DATABASE using file in default path使用默认路径中的文件创建数据库
【发布时间】:2009-10-28 14:31:25
【问题描述】:

我想创建一个用于创建数据库的 SQL 脚本。现在,我有这个:

CREATE DATABASE [Documents] ON  PRIMARY 
( NAME = N'Documents', FILENAME = N'Documents.mdf')
 LOG ON 
( NAME = N'Documents_log', FILENAME = N'Documents_log.ldf')
 COLLATE SQL_Latin1_General_CP1_CI_AS

但是,这会产生以下错误:

Msg 5105, Level 16, State 2, Line 2
A file activation error occurred. The physical file name 'Documents.mdf' may be incorrect. Diagnose and correct additional errors, and retry the operation.
Msg 1802, Level 16, State 1, Line 2
CREATE DATABASE failed. Some file names listed could not be created. Check related errors.

我知道问题在于我没有为文件名指定完全限定的路径。但无论数据库服务器的目录结构如何,我都希望能够运行此脚本。有什么方法可以使用默认路径吗?

【问题讨论】:

    标签: sql sql-server database


    【解决方案1】:

    创建数据库'Documents'并通过alter提供文件属性。

    USE [master]
    GO
    
    CREATE DATABASE [Documents]
    GO
    
    ALTER DATABASE [Documents] MODIFY FILE
    ( NAME = N'Documents', SIZE = 512MB, MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
    GO
    
    ALTER DATABASE [Documents] MODIFY FILE
    ( NAME = N'Documents_log', SIZE = 256MB, MAXSIZE = UNLIMITED, FILEGROWTH = 10% )
    GO
    

    此脚本更便携,无需任何修改即可部署在多个服务器中。

    【讨论】:

    【解决方案2】:

    您可以在不指定文件详细信息的情况下创建数据库,例如:

    CREATE DATABASE Documents;
    

    【讨论】:

    • 是的,但是如果我需要指定额外的属性,比如 SIZE 和 FILEGROWTH 怎么办?我已经看到使用 XP 读取注册表的解决方案,但是如果您没有在默认实例上运行怎么办?该注册表项/值不会给出正确的答案。仍在搜索,所以我认为这不是我自己回答的问题。
    • 在创建数据库后添加更改数据库脚本以指定其他属性,例如 SIZE 和 FILEGROWTH。
    【解决方案3】:

    How do I find the data directory for a SQL Server instance?

    如果您使用的是 SQL Server 2012 或更高版本,您可以使用

    找到默认路径
    select 
      InstanceDefaultDataPath = serverproperty('InstanceDefaultDataPath'),
      InstanceDefaultLogPath = serverproperty('InstanceDefaultLogPath')
    

    然后您可以使用 exec() 来构造您的 CREATE DATABASE 语句。

    如果您希望数据库的物理文件名不同于默认名称,这很有用。

    【讨论】:

    • 谢谢。但是如何在 CREATE DATABASE 脚本中使用它?执行 CREATE DATABASE [Documents] ( NAME = N'Documents', FILENAME = @InstanceDefaultDataPath + N'Documents.mdf' ... 会出现错误 - 您无法将查询结果与 CREATE DATABASE 中的 DB dame 连接起来脚本
    • @ReversedEngineer 我认为您需要构建 CREATE DATABASE 语句并动态执行它。
    【解决方案4】:

    添加到@Blade 的答案。下面是获取默认路径服务器属性并使用 EXECUTE 方法的示例:

    DECLARE @DefaultDataPath varchar(max)
    SET @DefaultDataPath = (SELECT CONVERT(varchar(max), SERVERPROPERTY('INSTANCEDEFAULTDATAPATH')))
    DECLARE @DefaultLogPath varchar(max)
    SET @DefaultLogPath = (SELECT CONVERT(varchar(max), SERVERPROPERTY('INSTANCEDEFAULTLOGPATH')))
    
    EXECUTE('
    CREATE DATABASE [blah] ON PRIMARY
    ( NAME = N''blah'', FILENAME = ''' + @DefaultDataPath + 'blah.mdf'', SIZE = 167872KB, MAXSIZE = UNLIMITED, FILEGROWTH = 16384KB )
     LOG ON
    ( NAME = N''blah_Log'', FILENAME = ''' + @DefaultDataPath + 'blah_Log.mdf'', SIZE = 2048KB, MAXSIZE = 2048GB, FILEGROWTH = 16384KB );
    COLLATE SQL_Latin1_General_CP1_CI_AS;
    ');
    GO
    

    请注意,如果您执行USE 来切换dbs,则会丢失局部变量范围。因此,如果您在脚本中创建多个 db,请在开始时全部创建它们,或者将变量的 declare/set 复制到每个创建中。

    【讨论】:

      【解决方案5】:

      我相信你可以做到的

      CREATE DATABASE [Documents]
      

      没有 ON .... 它将使用路径和其余部分的默认值创建。

      【讨论】:

        【解决方案6】:

        了解如何创建Default Path。看看它是否对您正在寻找的内容有所帮助。

        干杯,

        【讨论】:

        • proost!,prost!,santé,敬礼,salud!,živjeli!,kippis!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-21
        • 2013-06-26
        相关资源
        最近更新 更多