首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建仅使用ldf文件创建的数据库2 .ldf文件

创建仅使用ldf文件创建的数据库2 .ldf文件
EN

Stack Overflow用户
提问于 2019-08-28 08:54:04
回答 2查看 335关注 0票数 0

当我在没有指定ldf文件的情况下运行此查询时,它会自动创建ldf文件。

代码语言:javascript
复制
Declare @DBname nvarchar(50) = 'Test'
Declare @path nvarchar(50) = 'D:\DB'
Declare @query nvarchar(max) 

set @query = '

CREATE DATABASE ' + @DBname + '
ON
( NAME = ' +@DBname+',  
    FILENAME = '''+@path+'\'+@DBname+'.mdf'+''',
    SIZE = 1024,
    MAXSIZE = unlimited,
    FILEGROWTH = 500 )  
'
exec (@query)

但是当我运行这个查询时:

代码语言:javascript
复制
Declare @DBname nvarchar(50) = 'Test'
Declare @path nvarchar(50) = 'D:\DB'
Declare @query nvarchar(max) 

set @query = '

CREATE DATABASE ' + @DBname + '
ON 
( NAME = '+@DBname+'_log'+',  
    FILENAME = ''' +@path+'\'+@DBname+'_log.ldf'+''',
    SIZE = 100,
    MAXSIZE = unlimited,
    FILEGROWTH = 100 );
'
exec (@query)

它创建了2个没有.ldf文件的.mdf文件。我不明白为什么它会自动创建2个.ldf文件,而不是像在上面的查询中那样自动创建mdf文件:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-28 08:57:53

您已经为mdf文件指定了ldf扩展名。它仍然是一个数据文件。日志文件使用' log ON‘指定,数据文件使用'ON’指定,就像您所做的那样。

实际的日志文件规范是可选的,默认情况下是创建的。

查看语法:https://learn.microsoft.com/en-us/sql/relational-databases/databases/create-a-database?view=sql-server-2017

票数 4
EN

Stack Overflow用户

发布于 2019-08-28 09:03:11

您要在SQL中命名的文件是数据库文件,而不是日志文件。因此,您正在创建一个mdf文件,并给它一个ldf扩展名。就像要创建一个xlsx文件,但是给它一个csv的扩展名。

如果要指定日志文件的详细信息,则需要使用LOG ON语法进行指定;如文档创建指定数据和事务日志文件的数据库所示

代码语言:javascript
复制
USE master;
GO
CREATE DATABASE Sales
ON
( NAME = Sales_dat,
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\saledat.mdf',
    SIZE = 10,
    MAXSIZE = 50,
    FILEGROWTH = 5 )
LOG ON
( NAME = Sales_log,
    FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\salelog.ldf',
    SIZE = 5MB,
    MAXSIZE = 25MB,
    FILEGROWTH = 5MB ) ;
GO

就您的情况而言,这可能会导致:

代码语言:javascript
复制
DECLARE @DBname sysname = N'Test';
DECLARE @path sysname = N'D:\DB';
DECLARE @query nvarchar(MAX);

SET @query = N'CREATE DATABASE ' + QUOTENAME(@DBname) + N'
ON 
( NAME = N'  + QUOTENAME(@DBname, '''') + N',  
    FILENAME = N' + QUOTENAME(@path + N'\' + @DBname + N'.mdf', '''') + N',
    SIZE = 1024,
    MAXSIZE = unlimited,
    FILEGROWTH = 500 )
LOG ON
( NAME = N'  + QUOTENAME(@DBname + '_log', '''') + ',  
    FILENAME = N' + QUOTENAME(@path + N'\' + @DBname + N'_log.ldf', '''') + ',
    SIZE = 100,
    MAXSIZE = unlimited,
    FILEGROWTH = 100 );';

EXEC sys.sp_executesql @query;

请注意,我已经将您的数据类型更改为sysname,并使用QUOTENAME来避免注入。如果您的路径比128个字符长,这是行不通的;但根据示例,我认为这是不可能的。

如果您有超过128个字符,请使用下面的语法来表示路径表达式。

代码语言:javascript
复制
N'...N''' + REPLACE({Your Path  Expression}, '''', '''''') + N''' ...'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57688523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档