达梦数据库的用户和模式应该如何理解

达梦数据库的用户和模式应该如何理解?

最近参加了达梦DCA认证培训,课程里提到了达梦数据库有个特殊的概念–模式。这个对于习惯用户式操作的Oracler来说,是耳目一新的。下文从达梦论坛里摘选出hql专家的应答便于自己记忆和理解该概念。


非常重要的一句话:
我们所说的配置登录默认模式、模式切换,都是某一个用户自己建立的多个模式之间切换,模式和用户不存在授权的概念,也不能授权,只有属于和不属于;同时,我们所有的模式切换,是不能跨到其他用户下面去的.


达梦的用户和模式是什么?

达梦的用户,是数据库实例里一个逻辑概念。它是一个操作空间、一个逻辑空间,在这个空间内,可以建立表结构,部署应用。

比如说,一个数据库实例上,我们新建2个用户,每个用户独立部署一个应用系统。说明如下:

  • 当然,也可能是新建2用户,每个用户独立部署一个模块(每个模块,有自己独立的一套表结构)。
  • 大家尽量不要在一个实例中,攒太多的系统;低耦合的时代,这样子不好。

上面的理解是对的吗?对于Oracle的小伙伴来说,是对的。把达梦理解成一个单用户单模式的数据库即可。但,实际上,这个又不太对:

  • 实际上,达梦上面,承载业务逻辑的不是用户,而是模式,我们在新建用户时,系统会自动新建一个和用户名相同的模式,我们所有的操作,都是在“模式”中。
  • 而且,达梦一个用户,是可以对应多个模式的(当我们要实现,在一个连接中,切换模式,那么就必须使用单用户多模式的方法)。

多模式怎么使用?

直接使用对应用户新建模式即可,比如:

sysdba登录数据库,直接执行create schema schema1;或者create schema schema2 AUTHORIZATION sysdba;
就可以为用户sysdba,额外新建 schema1schema2 两个模式。

注意:经过上面的操作,sysdba这个用户,就有3个模式了,sysdbaschema1schema2


经典用法-SQL语句不希望加模式名

如果我们碰到这个问题:select * from schema_name.tablename;
开发的同事问,能不能执行的时候,不带schema_name.,直接写成select * from tablename;

这个是可以的,但又不是完全可以,比如:

1、如果我们新建 schema_name 这个用户,那么我们使用 schema_name 这个用户登录时,语句里涉及到的表,都会默认带上 schema_name. 这个头缀(这么理解,是比较形象的)是可以的。
要求:必须新建同名用户后,再迁移数据。
说明:这里既然是“默认带上”,那么后面这句话就好理解了 —— 所有的其他模式(不管是这个用户下的,还是不是这个用户下的对象,如果要访问,就必须通过 模式名.对象名,才可以访问到 —— 这是理所当然的,如果这个也可以省略,那多个模式下的同名对象那不弄混了)

2、我们也可以新建用户user1(系统自动生成了user1这个同名模式),可以直接为user1新建一个 schema_name的模式,那么在配置jdbc连接属性的时候,可以指定 schema的属性=schema_name,也可以实现上面的效果(sql语句不用加这schema_name这个模式名);同理,如果要访问其他模式,肯定是必须加模式名的。


模式问答

1、模式有自己的权限吗?我们可以给某个用户授予某个模式的权限吗?

模式没有自己的权限,我们不可以给某个用户授权模式权限(模式和权限,基本上不太会出现在同一句话里)。

2、达梦的模式和Oracle的模式有什么区别?如何理解

如果是从Oracle迁移过来的,请大家保持单用户单模式的使用模式。

  • 先为Oracle的每一个用户,都在达梦上,先建立好对应的用户,再迁移数据。
  • 忘掉模式的概念,眼里只有用户。
3、达梦的模式和Mysql的库有什么区别?如何理解

如果是从Mysql迁移过来的,一般也请大家保持单用户单模式的使用模式。

  • 先为Mysql的每一个库名,都在达梦上,先建立好对应的用户,再迁移数据。
  • 忘掉模式的概念,眼里只有用户。

如果,我们有业务需要在同一个连接中切换库名(Mysql支持),那就不能按照上面 库->用户的方式迁移了,必须把这些需要切换的库名,设计成达梦上同一个用户下的多个模式。(重要)

4、达梦在连接串里面可以指定登录模式吗?(重要)

可以,jdbc连接串的属性可以指定。

5、在单用户多模式下,怎么查询自己当前模式下的对象?
1
2
3
4
5
6
7
8
9
SELECT
sch.name schema_name,
obj.*
FROM
sysobjects sch,
sysobjects obj
where
sch.id =obj.schid
AND SCH.NAME =SF_GET_SCHEMA_NAME_BY_ID(CURRENT_SCHID);

摘录的原帖地址:对达梦数据库用户和模式的理解