Sql server 禁用SA,创建新登录,将数据库角色成员身份更改为db所有者

Sql server 禁用SA,创建新登录,将数据库角色成员身份更改为db所有者,sql-server,docker,tsql,ssms,Sql Server,Docker,Tsql,Ssms,我正在尝试在SSMS中编写一个测试T-SQL脚本,它禁用SA用户,创建一个新的sysadmin并为所有数据库启用db owner,就像SA用户一样 USE [master] GO /****** Create New Login ******/ CREATE LOGIN [bob] WITH PASSWORD = '!Bob1' GO /****** Change Server Role ******/ ALTER SE

我正在尝试在
SSMS
中编写一个测试
T-SQL
脚本,它禁用
SA
用户,创建一个新的
sysadmin
并为所有数据库启用
db owner
,就像
SA
用户一样

    USE [master]
    GO
    
    /****** Create New Login ******/
    CREATE LOGIN [bob] WITH PASSWORD = '!Bob1'
    GO
    
    /****** Change Server Role ******/
    ALTER SERVER ROLE [sysadmin] ADD MEMBER [bob]
    GO
    
    /****** Change Role Membership ******/
    EXEC sp_addrolemember N'db_owner', N'bob'
    GO
    
    /****** Disable SA ******/
    ALTER LOGIN [sa] DISABLE
    GO
    
    /****** Create Database ******/
    CREATE DATABASE [test]
    GO
但是,当我运行脚本时,会出现以下错误:

Msg 15410,11级,状态1,程序sp_addrolemember,第35行[批次开始第13行] 此数据库中不存在用户或角色“bob”


我知道我可以右键单击,转到属性,转到用户映射,并手动为所有数据库选择
db owner
,但脚本背后的意图是在启动时在MSSQL Docker容器中运行它。

a
登录
用户
是两个完全不同的对象。
登录
是实例级对象,
用户
是数据库对象

对于
系统管理员
,无需在数据库中
创建
用户
,除非您计划将数据库迁移到另一个实例,其中存在具有相同SID的
登录
,并且该实例没有
系统管理员
权限

sysadmin
可以在实例上执行它想要的任何操作,而不需要任何映射到它的
USER
对象。它还忽略任何显式的
DENY
权限。因此,如果它真的只是有一个
系统管理员
,那么在每个数据库中创建一个
用户
,然后给该
用户
一个
数据库所有者
角色就不需要了。当一个
系统管理员连接到一个数据库时,他们会自动从
用户
dbo
继承权限;这让他们可以在数据库中自由支配

如果您正在创建
登录
和相关的
用户
,则正确的语法如下:

使用master;
去
使用PASSWORD=N'Some really secure PASSWORD 123(*&AT')创建登录原则;
更改服务器角色sysadmin添加成员YourLogin;
去
使用你的数据库;
去
创建用户YourPrinciple用于登录YourPrinciple;
改变角色db_所有者添加成员YourPrinciple;
去

仅供参考,不要使用
sp_addrolemember
;它将从SQL Server中删除。请使用
ALTER ROLE
,如上所示。

感谢您对
sp_addrolember
的介绍和答案。我认为这现在是有意义的,所以您基本上是说如果我不想要
用户
数据库对象,我不想要在我的例子中,我的新
bob
-
LOGIN
实例可以做他喜欢做的事情,即使
db owner
没有映射到
用户映射中的任何db
?你给
登录名为
bob
的服务器角色
sysadmin
@user1574598。
sysadmin
实际上可以在一个实例上做任何事情ce.从字面上说,我实际上是指字面上的意思。太好了,我现在明白了,所以我的脚本除了
sp\u addrolemember
行之外没有任何问题。我还将为
用户
数据库对象提供脚本解决方案,以解决您在回答中解释的情况。我想我之所以会感到困惑,是因为我注意到e> 右键单击
sa
进入用户映射时,为
dbo
用户选择了db owner
model
msdb
,以及
tempdb`数据库所有者,但没有为我的新
bob
-
登录名选择db owner。你有没有说过
sysadmin
继承自
dbo
e> 如果不正确,请道歉。不,这不是使用
sp_addrolemember
,@user1574598,而是您试图提供一个不存在的
用户(
bob
)数据库角色
db\u owner
。您不能将角色赋予不存在的用户。好吧,现在这也有意义,因此如果我在应用程序中更改连接字符串以使用
bob
而不是当前设置的
sa
,所有操作都应该完全相同。对不起,您在以前的edi中的帖子中说了什么关于
sysadmin
继承自
dbo