2013-10-30 36 views
0

我跑到下面的脚本消息5011,级别14,状态5,第11行ALTER DATABASE语句失败

DECLARE @name VARCHAR(50) 

DECLARE @Statment VARCHAR(500) 

DECLARE DB_cursor CURSOR 
FOR 
SELECT name 
FROM sys.databases 
WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb', 
         'ReportServer$SQLEXPRESS', 
         'ReportServer$SQLEXPRESSTempDB') 

OPEN DB_cursor 

FETCH NEXT FROM DB_cursor INTO @name 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    PRINT @name 

    ALTER DATABASE [@name] SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

    SET @Statment = 'Backup database ' + @name + ' To disk =N' + '''' 
     + 'C:\Mas\' + @name + '.bak' + '''' 

    PRINT @Statment 

    EXEC(@Statment) 
-- ALTER DATABASE [@name] SET MULTI_USER WITH ROLLBACK IMMEDIATE 
-- EXEC sp_dboption @name, N'offline', N'false' 
    FETCH NEXT FROM DB_cursor INTO @name 
END 
CLOSE DB_cursor 
DEALLOCATE DB_cursor 

我下面

消息5011,级别14,状态5错误,第11行
用户没有权限更改数据库'@name',数据库不存在或数据库未处于允许访问检查的状态。

Msg 5069,Level 16,State 1,Line 11
ALTER DATABASE语句失败。

请让我知道我被困在如何解决这个问题。

注意: - 我运行这个脚本在登录。

+0

路径,为什么你需要使数据库单个用户运行备份? ?? –

回答

2

错误消息明确指出原因。这是因为Alter database命令将[@name]视为数据库而不是占位符。您可以在动态查询中包含这两个语句,然后执行。下面应该工作:

DECLARE @name VARCHAR(50) 
DECLARE @Statment VARCHAR(500) 
DECLARE @Statment1 VARCHAR(500) 
DECLARE @Statment2 VARCHAR(500) 

select name from sys.databases where name NOT IN('master','tempdb','model','msdb','ReportServer$SQLEXPRESS','ReportServer$SQLEXPRESSTempDB') 

OPEN DB_cursor 

FETCH NEXT FROM DB_cursor INTO @name 

WHILE @@FETCH_STATUS = 0 

BEGIN 

Print @name 

SET @Statment = 'ALTER DATABASE ' + @name + ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE; ' 
EXEC(@Statment) 
    SET @Statment1 = 'BACKUP DATABASE ' + @name + ' To disk =N' +''''+ 'C:\Mas\'+ @name   +'.bak'+'''' 
EXEC(@Statment1) 
SET @Statment2 = 'ALTER DATABASE ' + @name + ' SET MULTI_USER WITH ROLLBACK IMMEDIATE; ' 
EXEC(@Statment2) 

EXEC(@Statment) 
-- ALTER DATABASE [@name] SET MULTI_USER WITH ROLLBACK IMMEDIATE 
-- EXEC sp_dboption @name, N'offline', N'false' 
FETCH NEXT FROM DB_cursor INTO @name 
END 
CLOSE DB_cursor 
DEALLOCATE DB_cursor 
0

SQL命令ALTER DATABASE不允许参数,因此它将@name视为实际名称而不是参数。

ALTER DATABASE

NAME 指定文件的逻辑名称。 logical_file_name 是引用文件时在Microsoft SQL Server中使用的名称。该名称在数据库中必须是唯一的,并符合标识符的规则。名称可以是字符或Unicode常量,常规标识符或分隔标识符。有关更多信息,请参阅Using Identifiers

0

您的数据库

DECLARE @A NVARCHAR(800) = ' ALTER DATABASE [' + 
          @name + 
          '] SET SINGLE_USER WITH ROLLBACK IMMEDIATE ' 
EXECUTE Sp_ExecuteSQL @A 

的变化状态最有用SP_ExecuteSQL然后你就可以在单用户模式设置数据库。

1

我改变你的T-SQL,这工作。

你最改变备份文件的目的地在这个样本的花药路径。

DECLARE @name VARCHAR(50) 

DECLARE @Statment VARCHAR(500) 

DECLARE DB_cursor CURSOR 
FOR 
SELECT name 
FROM sys.databases 
WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb', 
         'ReportServer$SQLEXPRESS', 
         'ReportServer$SQLEXPRESSTempDB') 

OPEN DB_cursor 

FETCH NEXT FROM DB_cursor INTO @name 

WHILE @@FETCH_STATUS = 0 
    BEGIN 

    PRINT @name 
--  DECLARE @A NVARCHAR(800) = ' ALTER DATABASE [' + @name + '] SET Multi_USER WITH ROLLBACK IMMEDIATE ' 
    DECLARE @A NVARCHAR(800) = ' ALTER DATABASE [' + @name + '] SET SINGLE_USER WITH ROLLBACK IMMEDIATE ' 
    EXECUTE Sp_ExecuteSQL @A 

    SET @Statment = 'Backup database ' + @name + ' To disk =N' + '''' 
     + 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER2012\MSSQL\Backup\' 
     + @name + '.bak' + '''' 

    PRINT @Statment 

    EXEC(@Statment) 
-- ALTER DATABASE [@name] SET MULTI_USER WITH ROLLBACK IMMEDIATE 
-- EXEC sp_dboption @name, N'offline', N'false' 
    FETCH NEXT FROM DB_cursor INTO @name 
END 
CLOSE DB_cursor 
DEALLOCATE DB_cursor 

像缩小图片

你最篦访问SQL Server的用户在你的Back up

enter image description here

相关问题