禁用 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 容器中。
一个LOGIN
和USER
是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
,如上所示。
我正在尝试在 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 容器中。
一个LOGIN
和USER
是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
,如上所示。