如何将 ID 分配给引用表以及如何正确显示? (SSMS)

问题描述

我正在使用 ERD 创建审计计划,从下图可以看到,有一个权限表,其中四个 FK 列引用了其他四个表的 PK 列。我只是对 ID 如何与其他表相关以及它如何在权限表中正确显示感到困惑?

对于用户表,我从“master.sys.server_principals”导入了数据。 对于实例表,我使用@@SERVERNAME 导入了数据。 对于数据库表,我从 master.sys.databases 导入了数据。 对于对象类型表,我从 master.sys.objects 导入了数据。

现在,我目前在权限表上并停留在这一点上,因为我想知道其他四个表(上面提到并显示在下面的图片链接中)中的 ID 如何与此权限表匹配。我知道我需要从 master.sys.database_permissions 查询获取“Permissions_Permission_Name”和“Permissions_Object_Name”两列的信息,但这只是我感到困惑的其他四个 ID 列......(您可以忽略列 {{ 1}})

Image of ERD of Audit Plan

解决方法

我将使用答案字段,因为评论编辑器中没有空格。此答案仅回答了您的问题的一部分,即我可以与系统表相关的四个表(数据库和用户)中的两个。

最重要的是:在填写Id时,您将首先生成其他表记录,保留生成的Identity Id,最后在每个Id字段中创建一个新的权限记录并填写正确的索引。当一个表包含其他表的索引时,这对任何此类更改都很重要。假设你知道。

问题是,您的结构与系统表不同。您将需要比 master.sys.database_permissions 更多的“权限”记录,因为 MsSQL 将这些记录为每个主体(角色)的权限,而不是每个用户的权限。

我解决了四个中的两个:

  • 用户通过 master.sys.database_role_members 连接到主体角色。用户角色的 ID 可以在您的源中作为 master.sys.database_permissions.grantee_principal_id 找到,具有此 principal_id 的相应用户列在 master.sys.database_role_members 中。

  • 您的数据库(一个数据库)的权限在您的权限记录中定义。此数据库记录中的数据库名称应映射到您服务器上的数据库。在该数据库中,您将找到 database_permissions.sys.server_principals。拥有权限的用户(再次)在 master.sys.database_role_members 中找到。

我不确定您打算如何处理其他 2 个表、实例和对象类型。

https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-database-permissions-transact-sql?view=sql-server-ver15

处参考有关该主题的 ms-docs