首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >禁用SA,创建新登录,将数据库角色成员资格更改为数据库所有者

禁用SA,创建新登录,将数据库角色成员资格更改为数据库所有者
EN

Stack Overflow用户
提问于 2020-08-18 10:37:40
回答 1查看 351关注 0票数 1

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

代码语言:javascript
运行
复制
    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容器中运行它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-18 10:53:07

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

对于sysadmin,除非您计划将数据库迁移到具有相同SID且不具有sysadmin权限的LOGIN的另一个实例,否则不需要在数据库中为它们创建一个USER

sysadmin可以在实例上执行它想做的任何事情,而不需要将任何映射的USER对象映射到它。它还会忽略任何显式的DENY权限。因此,如果确实存在一个sysadmin,那么在每个数据库中创建一个USER,然后赋予该USER db_owner角色是不必要的。当sysadmin连接到数据库时,它们会自动从USER dbo继承权限;这使它们可以自由地控制数据库。

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

代码语言:javascript
运行
复制
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,如上面所示。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63466876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档