我对 SQL Server 有点陌生,我正在尝试编写 Microsoft SQL Server (2005-2014) 安装后活动的脚本,但我在更改登录名方面有点卡住了。公司政策规定没有登录名应将 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 Server 处于 MIX 身份验证模式,所以几乎任何东西都可以登录 - SQL 登录、Windows 本地或域用户或组(不确定这是否会对解决方案产生任何影响)。解决方案应该几乎是版本独立的,但是假设从 SQL Server 2005 开始(......是的,仍然有一些古老的版本......)
谁能帮我找到适当的查询来实现这一目标?
您永远不应该尝试直接更新系统表,在大多数情况下它不会像您发现的那样让您这样做。
ALTER LOGIN
在您的情况下,您将希望在不知道实例上有多少的情况下构建动态语句。但是,您在执行此操作时需要小心谨慎,以确保您不触碰您不应该触碰的登录信息。此查询应该为您提供那些“非默认”或通过安装过程安装的登录:从这里你只需要构建你的语句来执行 via
sp_executesql
。您可以根据自己的喜好使用简单的光标或 while 循环,下面是我方便使用的基本光标的模板:下面是生成所需脚本的示例。