gpt4 book ai didi

sql-server - 禁用 SA,创建新登录,将数据库角色成员更改为数据库所有者

转载 作者:行者123 更新时间:2023-12-02 18:58:20 25 4
gpt4 key购买 nike

我正在尝试写一个测试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
但是,当我运行脚本时,出现此错误:

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.


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

最佳答案

一个 LOGINUSER是 2 个完全不同的对象。一个 LOGIN是实例级对象,USER是一个数据库对象。
对于 sysadmin没有必要CREATE他们是 USER在数据库中,除非您计划将数据库迁移到另一个实例,其中 LOGIN存在具有相同 SID 且没有 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 ,如上所示。

关于sql-server - 禁用 SA,创建新登录,将数据库角色成员更改为数据库所有者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63466876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com