这个问题与为在 LUW (linux-unix-windows) 上运行数据库的应用程序创建和初始化测试和开发数据库有关
在 oracle 上,我们有
- 一个操作系统用户(在 linux 上)调用
oracle
, - 管理员 oracle 用户调用
sys
或system
- 一个固定的预定义 oracle 用户,它是应用程序对象的所有者,我们称之为
appowner
- oracle用户是应用程序用户,即对appowner拥有的对象具有有限的特权,我们称之为
appuser
每当需要初始化数据库时,即从头开始,我们首先使用 oracle 用户连接到 oracle sys
,system
然后发出以下命令:
DROP USER appowner CASCADE;
然后我们从头开始重新创建用户和它拥有的对象。appuser
我们还对由创建的对象授予一些特权appowner
应用程序始终以身份登录,appuser
而不是appowner
除非对数据库执行任何管理任务。
现在我们正在将此应用程序移植到 db2,而这正是我们感到困惑的地方。
对于初学者,db2 创建这些 os 用户,它们也是 db2 用户:
dasusr1
db2inst1
db2fenc1
这三个用户如何映射到sys
/system
和?appowner
appuser
我相信dasusr1
是sys
/的粗略等价物system
,
db2inst1
是 的粗略等价物appowner
,并且
db2fenc1
是appuser
(如果我错了,请纠正我,我完全理解映射不准确)
在这种情况下,如果我必须删除 拥有的所有对象db2inst1
,我是否登录dasusr1
并删除用户db2inst1
?
oracle 用户和 db2 用户之间并没有真正的一对一映射,因为
db2inst1
可以创建多个数据库,而appuser
在oracle中映射到一个数据库- 在 db2 数据库中,可以有多个模式,而在 oracle 中,一个用户映射到一个模式
所以有点混乱。如果在将应用程序从 oracle 移植到 db2 方面有经验的人能够阐明 db2 和 oracle 用户之间的等价性,这将有助于找出 oracle drop user cascade 的 db2 等价物。
首先回顾一下 DB2 可能会有所帮助。
当您安装 DB2 时,它会创建一个实例。将其视为“服务器”。一个实例中可以有零到多个数据库(不能说我知道限制)。当您在本地创建 DB2 时,它为您创建了一个名为 DB2 的实例。通常当您在 Unix 服务器上安装 DB2 时,您会为实例命名。您可以在同一物理服务器上拥有多个实例。您的 dsinst1 id 是实例的“所有者”(通常实例以拥有它的 ID 命名)。你永远不想在不报废实例的情况下删除这个 ID,否则你可能会遇到一些非常奇怪的行为。此 ID(因为它是实例所有者)有权创建数据库,但不是必须的。DB2 用户 Ember Crooks 的这篇博文有助于向更熟悉 Oracle 的人解释实例的概念。
实例可以在其中创建数据库。我们稍后再讨论这个问题。
DAS(或 DB2 Administration Server)实际上更像是一项服务。它允许一些 GUI 工具(如 DB2 Control Center)与 DB2 交互。据我了解,该服务不是 DB2 运行所必需的,但对于最终用户从非命令行的角度与 DB2 交互时通常是必需的。(Mustaccio 我在这里正确吗?)。无论您在一个物理盒子上有多少个实例,DAS 都只有一个安装。这一安装可以为所有实例提供服务。执行 DAS 服务通常需要一个单独的 ID。这是你的 dasusr1。同样,您不想删除此 ID。此 ID 通常无权在您的数据库中创建任何对象。
现在是栅栏 ID(即 db2fenc1)。拥有其中一个是个好主意。创建实例时,您可以指定围栏 ID。如果你这样做了,它就会变成那个ID。如果您不这样做,那么实例所有者 ID 将成为栅栏 ID。栅栏 ID 用于在 DB2 中运行某些存储过程。在 DB2 中,有两种运行存储过程的方法:受保护的和未受保护的。Unfenced 意味着存储过程在 DB2 引擎的内存中运行。它会运行得更快,但如果存储过程不仅仅是 SQL(例如,包含 C++ 或 Java 代码)并且它崩溃了,它可能会威胁到引擎并实际上使引擎崩溃并造成伤害。受保护的存储过程在 DB2 引擎内存之外运行。因此它们速度较慢,但如果它们崩溃,它们不会威胁到 DB2 引擎,因为它们在自己的受保护内存区域中运行。
ADMIN_CMD
存储过程,DB2 将切换实际执行导出的用户。这是因为您正在执行文件 I/O,而 DB2 希望运行此隔离以保护引擎。因此,即使您以实例所有者身份运行此存储过程调用,DB2 也会将 ID 切换为受保护的 ID(您没有机会更改此行为)。如果您查看拥有导出文件的权限,您会注意到它是受保护的 ID,而不是实例 ID(或您用来触发存储过程的其他 ID)。当然,如果您的实例 ID 是您的受保护 ID,那么它在您看来将是相同的。(大呼吸)。
好的。所以我说了这么多是为了简单地向您介绍 DB2。现在我们来谈谈您可能担心的问题——谁拥有什么?创建数据库的任何 ID 都拥有该数据库。DB2 接受的“组”通常具有
DBADM
(即数据库管理员)创建数据库的权限。因此,如果您使用实例所有者 ID 创建了一个数据库,那么它将是数据库的所有者以及它在数据库中创建的任何对象。如果不同的 ID 连接到数据库(只要它具有正确的权限),它就可以创建对象并拥有它们。这是关于 DB2 中的组和 ID 的有趣之处。从我所见,它们并不是真正的物体。所以你不能放弃它们。您也无法创建它们(至少从我所见)。当您授予或撤销对 ID 的权限时,DB2 会存储对该组或 ID 的提及。但是 DB2 并没有真正“创建”它们。我经常看到 DB2 指向操作系统或 LDAP 或两者来验证 ID。如果 ID 被删除,您必须手动从 ID 中删除权限和/或转移对象的所有权。这里没有什么神奇的。我问了一个类似的问题,与备份/恢复到不同的系统以及这如何影响权限有关。
最后,对于您对架构的评论,通常每个 ID 都映射到自己的架构。模式是否存在(由 DBADM ID 显式创建或由最终用户通过 IMPLICIT_SCHEMA 权限创建)是另一个问题。通常,无论连接到数据库的 ID 是什么,DB2 都假定模式与用户 ID 相同,并且您必须切换模式 (
SET SCHEMA MYSCHEMA
) 或明确提及您的对象 (SELECT * FROM MY_OTHER_SCHEMA.MY_TABLE
) 才能使用它们。希望这可以帮助。
@Chris Aldrich 给出了很好的解释。我将在这里添加一些内容。
1) DB2 中没有“数据库用户”的概念。所有身份验证都发生在数据库或实例之外,在操作系统中。此外,与 Oracle 不同,用户 ID 和模式名称之间没有直接关系。在 DB2 中,模式只是对象的逻辑分组,它没有任何特殊的安全特性。任何用户都可以创建任何架构。例如,当我以mustaccio 身份登录时,我运行语句
create table foo (id int...)
,这会创建一个模式 MUSTACCIO(如果它不存在)和其中的一个表。如您所见,架构名称解析默认为我的授权 ID。但是,我不妨运行语句create table alok.foo (id char(3)...)
,在这种情况下,它会创建一个模式 ALOK 和其中的表。mustaccio将是这两个表的所有者。2) 关于用户 ID 映射,我可能会说 DAS 所有者dasusr1和受保护的用户db2fenc1不映射到 Oracle 数据库中的任何内容。实例所有者db2inst1映射到oracle用户 ID。创建数据库的人(例如,可能是db2inst1或其他通过 SYSADM 组成员授权执行该操作的用户)在该数据库中获得 DBADM 和 SECADM 权限,这有点类似于系统和/或sys(我是不太确定Oracle数据库中两者之间的区别是什么)。如果您需要拥有数据库对象的功能 ID,则创建appowner在操作系统中,授予它适当的权限,并在创建对象时连接到该用户。类似地,您在操作系统中创建appuser ,授予它对象访问权限,并让您的应用程序以该用户身份连接。
3) 由于 DB2 中没有数据库用户,所以不能删除用户。要删除特定模式中的对象,您可以使用ADMIN_DROP_SCHEMA() 过程。