如何解决停用SA,创建新的登录名,将数据库角色成员身份更改为数据库所有者
我正在尝试在T-SQL
中编写测试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
但是,当我运行脚本时,出现此错误:
消息15410,级别11,状态1,过程sp_addrolemember,第35行[批处理开始第13行] 用户或角色'bob'在此数据库中不存在。
我知道我可以右键单击,转到属性,转到用户映射,然后为所有数据库手动选择db owner
,但是脚本的目的是在启动时在MSSQL Docker容器中运行它。
解决方法
LOGIN
和USER
是2个完全不同的对象。 LOGIN
是实例级对象,USER
是数据库对象。
对于sysadmin
,不需要CREATE
在数据库中USER
,除非您打算将数据库迁移到另一个实例,除非存在具有相同SID的LOGIN
,但没有sysadmin
权限。
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 Server中删除。如上所示,使用ALTER ROLE
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。