根据我之前提出的问题,我正在尝试按照 mustaccio 的回答推荐的解决方案,据此我有另一个 ID 来创建我的 DDL 对象。
我一直在尝试遵循名为“DB2 安全性,第 8 部分:十二个 DB2 安全性最佳实践”的 IBM 开发人员工作文章来尝试这样做。我注意到这篇文章当时似乎是为 DB2 8.2 编写的。我目前正在为 LUW 开发 DB2 9.7 修订包 4 ESE。具体来说,我在 AIX 上。我目前正在测试如何在我的本地系统上执行此操作,即 Windowx XP SP3 并使用 DB2 9.7 fix pack 4 Express-C for LUW。
在这种情况下,我有一个名为 db2admin 的本地用户帐户(即实例所有者)(在我们的 AIX 系统上不是这样)。此标识属于 DB2ADMNS 组。由于它与我的 Windows 帐户不同,我确保首先附加到实例,然后创建我的数据库以确保在我的数据库上授予 db2admin DBADM
, SECADM
, DATAACCESS
, ACCESSCTRL
。
db2 attach to DB2 user db2admin using ********
db2 create database SECTEST automatic storage yes on 'C:\' dbpath on 'C:\'
using codeset UTF-8 territory US collate using system
之后,我以 db2admin 身份连接到系统
db2 connect to sectest user db2admin using ********
然后为了测试一下,我确保我授予CONNECT
了SECADM
我的 Windows 帐户
db2 grant connect,secadm on database to user myid
然后我希望设置我的虚假 ID 以在其下创建对象。我有意将此 ID 创建为九个字符,以帮助防止从命令行连接到 DB2,但仍然允许通过SET SESSION_USER
. 为了简单起见,我将我的 ID 命名为 bobabob97。
所以我做了以下事情:
db2 grant CREATETAB,IMPLICIT_SCHEMA,BINDADD,CREATE_NOT_FENCED_ROUTINE,
CREATE_EXTERNAL_ROUTINE on database to user bobabob97
db2 grant use of tablespace userspace1 to user bobabob97
在这一点上,我认为我已经正确设置了所有内容。我没有明确地在数据库上授予 bobabob97 CONNECT
,因为我不希望任何人能够使用此 ID 连接到数据库。
所以现在我尝试切换到该 ID 来创建测试,创建我的对象并在通用 ID 下拥有它们。
db2 set session_user=bobabob97
但后来我收到以下错误:
DB21034E 该命令被作为 SQL 语句处理,因为它不是有效的命令行处理器命令。在 SQL 处理期间它返回: SQL0552N "DB2ADMIN" 没有执行操作 "SET SESSION AUTHORIZATION" 的特权。SQLSTATE=28000
所以,现在我很困惑。我当前以 (db2admin) 身份连接到数据库的 ID 在数据库上具有DBADM
、SECADM
、DATAACCESS
和ACCESSCTRL
(当然它隐含地包含CONNECT
、CREATETAB
、BINDADD
、QUIESCE_CONNECT
、IMPLICIT_SCHEMA
、LOAD
、CREATE_NOT_FENCED_ROUTINE
和CREATE_EXTERNAL_ROUTINE
)。我本质上是数据库上的“神”。为什么我不能切换到这个ID?
我试过玩GRANT SETSESSIONUSER
,但我知道SECADM
不能授予自己。我在这里做什么?
好的,我想我实际上想出了如何处理这个问题。我需要授予我的
DBADM
,SECADM
通过组而不是特定 ID 转移到任何 ID 的能力。通过这种方式,我绕过了SECADM
限制。由于我的 ID db2admin 在这个组中,它现在可以切换到任何 ID(公共部分)。如果我只想能够切换到该 ID,我可以使用:
所以现在我可以表演了
它有效。
要切换回来,我只需要运行