【问题标题】:Objects being created as DBO for all users in SQL Server application为 SQL Server 应用程序中的所有用户创建为 DBO 的对象
【发布时间】:2022-01-20 02:55:28
【问题描述】:

我们的 SQL Server 数据库有 Windows 身份验证。

每个对象都被创建为dbo,我不介意。但我们无法追踪谁创造了什么?有人可以帮助我们如何管理它,以便我们至少可以跟踪谁在做什么?跟踪中的登录名也是通用的

登录名 - ABC\gMSA_SQL$

如果我使用 Windows 身份验证登录服务器并运行以下命令选择 SUSER_NAME(),我可以看到我的用户名,而不是通用用户名。那么现在如果我创建一个表,我可以从哪里获得这个用户名?

【问题讨论】:

  • 架构不是你想用来跟踪谁创造了东西。那真是太可怕了。您可以使用默认跟踪来查看架构更改,但这只能追溯到一点点。您是否对数据库使用源代码控制?
  • 如果每个用户都应该创建属于他们并且只有他们使用的东西,也许每个用户都应该拥有自己的数据库。否则我同意肖恩的观点——模式不是你跟踪事物的方式。您可以继续使用DDL triggers,但正如他所建议的那样,您只会从the default trace 获得这么多过去的信息。
  • @AaronBertrand 谢谢。我只是想找到一种方法来跟踪,因为目前的一切都非常通用。我现在肯定会加入 DDL 触发器,但我必须确认我是否获得了正确的用户名。有多个包含大量数据的数据库,但至少在未来,我们将对谁在做什么进行某种跟踪。我不介意获取任何我可以获得的历史记录。
  • 嘿@sean,我们没有 dba,我更像是一名开发人员,数据库一团糟。我们无法跟踪谁创建了什么,因为我们启用了 Windows 身份验证。如果我使用此命令(选择 SUSER_NAME()),我可以看到我的用户名。我想找到这个用户名来创建对象,即使它不会回到历史很长时间,我需要找到它并开始将它保存在用户日志表中以跟踪 DDL 更改/更新。我可以看到的登录名在任何地方都是通用的。架构更改历史记录还具有每个对象的通用用户名。任何人都可以在服务器上创建任何东西。
  • 这是一个 DDL 日志记录的示例实现。请注意,它使用 SUSER_SNAME() mssqltips.com/sqlservertip/2085/… 我无法从您的 cmets 中得知您目前是否遇到 SUSER_SNAME() 不正确的问题?

标签: sql-server security windows-authentication user-management


【解决方案1】:

用户的默认架构设置为dbo。可能有很多原因,如下文msdn reference

默认架构将是第一个搜索的架构 服务器解析此数据库的对象名称时 用户。除非另有说明,否则默认架构将是所有者 此数据库用户创建的对象数。

如果用户有默认架构,则将使用该默认架构。如果 用户没有默认模式,但用户是 具有默认架构的组,该组的默认架构将 使用。如果用户没有默认架构,并且是成员 超过一组,用户的默认模式将是 具有最低 principal_id 和显式的 Windows 组的 设置默认架构。 (不可能明确选择其中之一 可用的默认模式作为首选模式。)如果没有默认 可以为用户确定模式,将使用 dbo 模式。

DEFAULT_SCHEMA 可以在它指向的架构之前设置 已创建。

在创建用户映射时无法指定 DEFAULT_SCHEMA 到证书或非对称密钥。

如果用户是 sysadmin 固定服务器角色。 sysadmin 固定服务器的所有成员 角色具有 dbo 的默认架构。

您可以通过运行以下查询来找出用户的默认架构。 Refer to sys.database_principals

SELECT default_schema_name FROM sys.database_principals

如果您想限制用户仅在其架构上创建对象,您必须执行以下操作:

CREATE SCHEMA [userPrincipalSchema];
GO
CREATE USER [userPrincipal]
WITH PASSWORD='SUPERCOMPLEXPASSWORDHERE'  
    , DEFAULT_SCHEMA=[userPrincipalSchema]  
GO 
DENY ALTER ON SCHEMA::[dbo] to [userPrincipal]
GO
ALTER AUTHORIZATION ON SCHEMA::[userPrincipalSchema] to [userPrincipal];
GO
GRANT CREATE TABLE, CREATE VIEW, CREATE PROCEDURE TO [userPrincipal];
GO

这样,您可以确保 [userPrincpal] 只能在其架构上创建对象,并且您可以跟踪由他们创建的对象。

【讨论】:

  • 谢谢文卡塔拉曼。我想我没有把自己说得很清楚。所以我编辑了问题 lil。问题是找出谁在服务器上创建了什么。每个人都使用相同的架构,这没关系,但每个对象都是由同一个通用用户创建的。而且我无法找到在创建特定数据库/表/任何其他对象时使用的 Windows 身份验证用户名。
  • @Doodle,这些用户对数据库有什么权限?他们是否有个人登录或通过 windows 组访问?
  • 据我所知,他们可以通过 windows 组访问。我们通过windows身份验证登录。每个登录名都是 ABC\gMSA_SQL$ 每个用户都可以创建他们想要的任何表
  • 从名字上看,它是托管服务帐户,它可以被用户正在使用的应用程序使用。所有用户都通过 Windows 身份验证连接到应用程序,然后应用程序使用托管服务帐户连接到数据库。 docs.microsoft.com/en-us/previous-versions/windows/it-pro/….
猜你喜欢
  • 1970-01-01
  • 2019-04-19
  • 2013-02-21
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多