如何编写脚本来确保登录名只是“公共”角色的成员并且不能删除表?

问题描述 投票:0回答:1

我想要一个可以不时重新运行的 T-SQL 脚本,以确保给定的服务器登录名仅是公共角色的成员,并且不能删除表。如果我团队中的某人不小心授予此登录系统管理员权限,我希望有一个脚本以某种频率在 SQL 作业上运行,以将角色“重置”回公共成员身份,以减轻更改造成的潜在损害。

关于防止表被删除,从我读到的内容来看,似乎很容易确保登录是公共角色的一部分而不是其他角色。这是真的?如果是这样,那么我只需要脚本来撤销除公共之外的所有内容的成员资格。

这是我迄今为止尝试过的:

ALTER SERVER ROLE public ADD MEMBER HandheldServiceAcct;  
GO 

但是我得到两个错误:

消息 156,第 15 级,状态 1,第 5 行
关键字“public”附近的语法不正确

消息 102,第 15 级,状态 1,第 5 行
“MEMBER”附近的语法不正确

此外,我不知道如何撤销所有其他角色的成员资格。

sql-server t-sql security sql-server-2016
1个回答
0
投票

public
是 T-SQL 保留关键字,因此需要将其括在双引号或方括号中才能用作标识符。但是,无需检查公共成员身份,因为所有登录都是
public
服务器角色的隐式成员,并且无法显式添加/删除成员。

对于给定的登录名,如果不需要,您可以简单地删除 sysadmin 服务器角色成员身份。

删除表的能力是一种数据库级别的权限,因此您需要迭代登录可以访问的所有数据库,并检查每个数据库是否授予用户不需要的权限或角色成员资格。

db_owner
db_ddladmin
等内置数据库角色不仅允许用户删除给定数据库中的表,显式
GRANT
语句(例如
GRANT CREATE TABLE TO SomeUser;
)也可以授予权限。简单地检查角色成员资格并不足以绝对保证用户不能删除表,但可能足以满足您的用例。否则,您将需要使用模拟 (
EXECUTE AS
) 和 HAS_PERMS_BY_NAME,或者查询 sys.database_permissions

© www.soinside.com 2019 - 2024. All rights reserved.