如何将默认数据库更改为所有登录名?

How to change default database to all logins?

我对 SQL 有点陌生,我正在尝试编写 SQL post 安装活动的脚本,但我在更改登录时遇到了一些困难。公司政策规定 none 登录名应默认使用 master 数据库,因此我的计划是确定所有默认使用 master 的登录名并将 master 更改为 tempdb.

可以使用这样的查询更改单一登录:

ALTER LOGIN [sa] WITH DEFAULT_DATABASE = tempdb

尝试在所有登录上实现这一点(不知道他们的数量或名称),我知道我很天真,希望这样的事情会起作用(但不得不尝试):

UPDATE master..syslogins
SET dbname = 'tempdb'
WHERE dbname = 'master'

显然输出错误(听起来合乎逻辑):

Ad hoc updates to system catalogs are not allowed.

SQLs 处于 MIX 身份验证模式,所以几乎任何东西都可以登录 - SQL 登录,Windows 本地或域用户或组(不确定这是否可以使解决方案的任何差异)。解决方案应该与版本无关,但假设从 SQL 2005 年开始(...是的,仍然有一些古老的版本...)

任何人都可以帮我找到合适的查询来实现这个吗?

提前感谢您的任何提示

DECLARE @LoginName  SYSNAME;
DECLARE @Sql        NVARCHAR(MAX);


DECLARE Cur CURSOR FOR
SELECT loginname 
FROM sys.syslogins
WHERE name NOT LIKE '%#%'  
   AND name  <> 'SA'
-- AND   --<-- here add more clauses to target the desired logins only    

OPEN Cur 
FETCH NEXT FROM  Cur INTO @LoginName

WHILE (@@FETCH_STATUS = 0)
BEGIN
  SET @Sql = N'ALTER LOGIN ' + QUOTENAME(@LoginName) 
           + N' WITH DEFAULT_DATABASE = [tempdb];'

         -- PRINT @SQL  --<-- test before you actually execute it             
  EXEC (@SQL)

  FETCH NEXT FROM  Cur INTO @LoginName  
END 

CLOSE Cur;
DEALLOCATE Cur;