我正在尝试用SSMS
编写一个测试SSMS
脚本,它禁用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容器中运行它。
发布于 2020-08-18 10:53:07
LOGIN
和USER
是两个完全不同的对象。LOGIN
是实例级对象,USER
是数据库对象。
对于sysadmin
,除非您计划将数据库迁移到具有相同SID且不具有sysadmin
权限的LOGIN
的另一个实例,否则不需要在数据库中为它们创建一个USER
。
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
FYI,不要使用sp_addrolemember
;它将从Server中删除。使用ALTER ROLE
,如上面所示。
https://stackoverflow.com/questions/63466876
复制相似问题