我有一个 T-SQL 脚本,它删除并重新创建数据库,如下所示:
USE master
GO
IF EXISTS (SELECT name FROM sys.databases WHERE name = N'foo')
BEGIN
ALTER DATABASE [foo]
SET OFFLINE WITH ROLLBACK IMMEDIATE;
DROP DATABASE [foo]
END
GO
CREATE DATABASE foo;
GO
-- OTHER DDL statements
现在我的系统处于数据库被删除但 LDF/MDF 存在的状态,因此 CREATE DATABASE 语句处于以下状态:
Msg 5170, Level 16, State 1, Line 2
Cannot create file 'C:\Program Files\Microsoft SQL Server\MSSQL10.PEER1\MSSQL\DATA\eventManagement.mdf' because it already exists. Change the file path or the file name, and retry the operation.
Msg 1802, Level 16, State 4, Line 2
CREATE DATABASE failed. Some file names listed could not be created. Check related errors.
恢复数据库命令在 WITH 子句中有一个 REPLACE 选项,用于处理这种情况。CREATE DATABASE 语句中是否有等效选项?
答案1
我认为这是因为你设置的离线语句而发生的。
尝试这样的操作:
create database foo
GO
IF EXISTS (SELECT name FROM sys.databases WHERE name = N'foo')
BEGIN
ALTER DATABASE [foo] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DROP DATABASE [foo]
END
CREATE DATABASE foo;
GO
答案2
没有与 CREATE DATABASE 等效的语句,因为您不希望有人覆盖非数据库文件。SQL Server 不知道该文件是从哪里遗留下来的 - 就此而言,它可能是一个 OS 文件。允许人们创建数据库并覆盖 OS 文件将是一个安全漏洞。