小编Luk*_*ord的帖子

游标/While 循环是对多个数据库进行管理更改的唯一方法吗?

我特别想要一种可编程方式来更改服务器上所有数据库的恢复模型,并且我知道此解决方案可以应用于所有“更改数据库”命令。虽然我知道 PowerShell 中的 SMO 可以很容易地解决这个问题:

Import-Module SQLPS
CD SQL\*ServerName*\*InstanceName*\databases
foreach ($database in (ls -force)){
$database.recoverymodel = 'Full'
$database.update
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找最有效的 T-SQL 解决方案。不惜一切代价避免使用游标已经在我的脑海中根深蒂固,但是我想不出基于集合的解决方案来执行更改语句。这是基于游标的解决方案。

DECLARE @sql varchar(MAX), @name varchar(50)

DECLARE cur CURSOR FOR
SELECT name 
FROM sys.databases
where name <> 'tempdb';
OPEN cur

FETCH NEXT FROM cur 
INTO @name

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @sql = 'ALTER DATABASE ' + @name + ' SET RECOVERY FULL;'
    exec(@sql)
    FETCH NEXT FROM cur INTO @name
END
CLOSE CUR
DEALLOCATE cur
Run Code Online (Sandbox Code Playgroud)
  1. 这也可以通过 while 循环来完成,但该解决方案仍要经过循环过程……while …

performance sql-server powershell smo alter-database

6
推荐指数
2
解决办法
1085
查看次数

在服务器的所有实例上备份所有数据库的 TSQL 解决方案?

我很确定我想要的当前实现是不可能的,sys.databases 目录视图在服务级别范围内可以了解其他 SQL Server 实例 (lol)。但我认为很多事情用电脑是不可能的,所以希望我能用不同的方式解决我的问题。

我已经创建了一个 PowerShell 解决方案,该解决方案使用 SMO 来备份所有实例上的所有数据库,但是由于安全原因,我无法在不将运行代理作业的代理帐户设为本地管理员的情况下使该解决方案工作服务器。

作为替代方案,我编写了一个 T-SQL 脚本,该脚本将作为代理作业运行,并每 15 分钟对 SQL Server 实例中的所有数据库进行完整、差异或事务备份。

    DECLARE @sql nvarchar(MAX) = N'';

--Check time for full backup
IF (DATENAME(weekday,getdate()) = 'Sunday' AND convert(time,getdate()) > '00:00' and convert(time,getdate()) < '00:15')
    BEGIN
        SELECT @sql += 'BACKUP DATABASE ' + QUOTENAME(name) 
                    + ' TO DISK = N''C:\backups\' + @@ServiceName  + '_' + name + '__' 
                    + cast(year(getdate()) as nvarchar(4)) + '_' + cast(month(getdate()) as nvarchar(2)) + '_' + cast(day(getdate()) as nvarchar(2)) …
Run Code Online (Sandbox Code Playgroud)

sql-server backup instance t-sql smo

1
推荐指数
1
解决办法
898
查看次数