【单选题】使用普通用户 user01 新建了一个数据库 scott,下列说法不正确的是?
- 用户 user01 具有 createdb 权限
- 用户 user01 是数据库 scott 的拥有者
- 超级用户 system 可以直接删除数据库 scott
- 超级用户 system 可以直接删除用户 user01
解题思路:
1、连接 KingBase 数据库,创建一个普通用户 user01,然后尝试创建一个数据库 scott:
-- 首先创建一个用户 user01
test=# create user user01 with password 'kingbase';
CREATE ROLE
-- 查看 user01 的用户权限
test=# \dg user01
List of roles
Role name | Attributes | Member of
-----------+------------+-----------
user01 | | {}
-- 连接用户 user01
test=# \c test user01
Password for user user01:
You are now connected to database "test" as userName "user01".
test=>
-- 尝试创建数据库 scott 报错,没有创建数据库的权限,由此可见,必须要对普通用户授权创建数据库权限才可以创建数据库 scott
test=> create database scott;
ERROR: 创建数据库权限不够
-- 使用 system 用户进行授权
test=> \c test system
Password for user system:
You are now connected to database "test" as userName "system".
test=# alter user user01 createdb;
ALTER ROLE
-- 查看 user01 权限
test=# \dg user01
List of roles
Role name | Attributes | Member of
-----------+------------+-----------
user01 | Create DB | {}
-- 再次创建数据库 scott 成功
test=# \c test user01
Password for user user01:
You are now connected to database "test" as userName "user01".
test=> create database scott;
CREATE DATABASE
由上可知,user01 具有 createdb 权限,才可以创建 scott 数据库,所以选项 1 是正确的。
2、用户 user01 是数据库 scott 的拥有者:
test=> \l scott
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-------+--------+----------+---------+-------+-------------------
scott | user01 | GBK | C | C |
查看数据库 scott 的信息,拥有者确实是 user01。
3、超级用户 system 是否可以直接删除数据库 scott:
test=> \c test system
Password for user system:
You are now connected to database "test" as userName "system".
test=# drop database scott;
DROP DATABASE
可以直接删除数据库 scott。
4、超级用户 system 可以直接删除用户 user01:
-- 第一种情况,数据库 scott 已被删除的情况,删除 user01 成功
test=> \c test system
Password for user system:
You are now connected to database "test" as userName "system".
test=# drop database scott;
DROP DATABASE
test=# drop user user01;
DROP ROLE
-- 第二种情况,数据库 scott 未被删除的情况,删除 user01 失败
test=# create user user01 with password 'kingbase';
CREATE ROLE
test=# alter user user01 createdb;
ALTER ROLE
test=# \c test user01
Password for user user01:
You are now connected to database "test" as userName "user01".
test=> create database scott;
CREATE DATABASE
-- 使用 system 删除用户 user01
test=> \c test system
Password for user system:
You are now connected to database "test" as userName "system".
test=# drop user user01;
ERROR: 无法删除"user01"因为有其它对象倚赖它
DETAIL: 数据库 scott的属主
本题考察我们的应该是用户 user01 存在数据库 scott 时,使用 system 删除用户是否成功,所以明显是无法删除的。由此可知,Kingbase 数据库的用户如果有依赖的对象存在,则无法删除,必须要将依赖的对象删除或者移走才可以删除用户:
-- 将 scott 数据库移动到 system 用户下
test=# alter database scott owner to system;
ALTER DATABASE
test=#
test=# \l scott
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-------+--------+----------+---------+-------+-------------------
scott | system | GBK | C | C |
(1 row)
-- 再次删除用户 user01 成功
test=# \conninfo
You are connected to database "test" as user "system" on host "localhost" (address "::1") at port "54321".
test=# drop user user01;
DROP ROLE
当用户 user01 下没有任何依赖对象时,可以成功删除。
📚 推荐阅读:DBA 学习之路
如果这篇文章对你有帮助,推荐访问我的 Oracle DBA 系统学习站点,涵盖 100 天完整学习路线:
- 🔧 Oracle 安装部署 · RMAN 备份恢复 · Data Pump 数据迁移
- 🏗️ RAC 高可用 · DataGuard 容灾 · 多租户架构
- 🔍 故障排查 · 升级迁移 · GoldenGate 数据同步