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

Posted

技术标签:

【中文标题】如何将 ID 分配给引用表以及如何正确显示? (SSMS)【英文标题】:How to assign the IDs to the referring table and how to display this correctly? (SSMS) 【发布时间】:2021-05-13 02:12:20 【问题描述】:

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

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

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

【问题讨论】:

“对于Users表,我从'master.sys'中导入了数据。” 问题:为什么要复制数据库服务器上已有的数据?您可以在查询中使用 sys.server.. 表,您不必重复信息,或担心索引。而且,您无需担心实际检查,SQLServer 将执行它们并提供对话框用户权限。我会说,不要重新发明***。为此还有其他工具,例如 OAuth.. 可供下载和使用。 @Goodies - 感谢您对此的回复,我了解我正在寻找的信息已经存在于数据库服务器上,您提到的几点都是有道理的。这个过程到位只是为了看看我是否能做到这一点。那么您是否认为有一种方法可以让 ID 正确显示在权限表上,如何才能做到这一点?谢谢。 【参考方案1】:

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

首先:填写Id的时候,先生成其他表的记录,保持生成的Identity Id,最后新建一个Permission记录,并在每个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 中列出。

您的权限记录中定义了一个数据库(ONE 数据库)。此数据库记录中的数据库名称应映射到您服务器上的数据库。在该数据库中,您将找到 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

【讨论】:

非常感谢您的意见@Goodies!通过像这样分解它,你让我对这个过程有了更好的了解,我可以看到人们所说的“更大的图景”。我将尝试使用您上面的观点最小化和简化这个过程,看看我在哪里得到它 - 关于其他 2 个表格,我可能会审查这个并将它们从这个过程中删除,以保持一切井井有条。再次,非常感谢,不胜感激!

以上是关于如何将 ID 分配给引用表以及如何正确显示? (SSMS)的主要内容,如果未能解决你的问题,请参考以下文章

如何将选择结果分配给变量?

Access 中两个任务列表的 SQL 查询 - 如何获得正确的“分配给”?

对指针的引用如何在C ++中完全起作用,以及何时需要它们(在链表的情况下)

如何将自定义分配器的完全相同的状态传递给多个容器?

如何返回自动增量ID,REST服务

如何将相同的 ID 分配给字符的字谜?