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

Disable SA, Create New Login, Change Database Role Membership to db owner

我正在尝试在 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, Level 11, State 1, Procedure sp_addrolemember, Line 35 [Batch Start Line 13] User or role 'bob' does not exist in this database.

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

一个LOGINUSER是2个完全不同的对象。 LOGIN 是实例级对象,USER 是数据库对象。

对于 sysadmin 没有必要 CREATE 他们 USER 在数据库中 除非 你打算迁移数据库到另一个实例,其中存在具有相同 SID 的 LOGIN,但它没有 sysadmin 权限。

A sysadmin 可以在实例上做任何事情,不需要任何映射的 USER 对象。它还会忽略任何显式 DENY 权限。因此,如果确实只是 sysadmin,那么就不需要在每个数据库中创建一个 USER,然后将 USER 赋予 db_owner 角色。当 sysadmin 连接到数据库时,它们会自动继承 USER dbo 的权限;这让他们可以自由支配数据库。

如果您正在创建 LOGIN 和相关的 USER,那么正确的语法如下:

USE master;
GO

CREATE LOGIN YourPrinciple WITH PASSWORD = N'Some really secure password 123 (*&AT';

ALTER SERVER ROLE sysadmin ADD MEMBER YourLogin;
GO

USE YourDatabase;
GO
CREATE USER YourPrinciple FOR LOGIN YourPrinciple;

ALTER ROLE db_owner ADD MEMBER YourPrinciple;
GO

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