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

时间:2015-01-25 22:36:56

标签: sql-server database tsql login

我对SQL有点新手,我正在尝试编写SQL安装后的活动脚本,而且我在改变登录时遇到了麻烦。公司策略规定,任何登录都不应将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.

SQL处于MIX身份验证模式,因此几乎任何东西都可以登录 - SQL登录,Windows本地或域用户或组(不确定这是否会对解决方案产生任何影响)。解决方案应该是版本独立的,但是让我们说开始SQL 2005前进(...是的,仍然有一些古老的版本...)

有人可以帮我找到合适的查询来实现这个目标吗?

感谢您提前提取任何提示

1 个答案:

答案 0 :(得分:2)

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;
相关问题