达梦数据库的用户和模式应该如何理解?
最近参加了达梦DCA认证培训,课程里提到了达梦数据库有个特殊的概念–模式。这个对于习惯用户式操作的Oracler来说,是耳目一新的。下文从达梦论坛里摘选出hql专家的应答便于自己记忆和理解该概念。
非常重要的一句话:
我们所说的配置登录默认模式、模式切换,都是某一个用户自己建立的多个模式之间切换,模式和用户不存在授权的概念,也不能授权,只有属于和不属于;同时,我们所有的模式切换,是不能跨到其他用户下面去的.
达梦的用户和模式是什么?
达梦的用户,是数据库实例里一个逻辑概念。它是一个操作空间、一个逻辑空间,在这个空间内,可以建立表结构,部署应用。
比如说,一个数据库实例上,我们新建2个用户,每个用户独立部署一个应用系统。说明如下:
- 当然,也可能是新建2用户,每个用户独立部署一个模块(每个模块,有自己独立的一套表结构)。
- 大家尽量不要在一个实例中,攒太多的系统;低耦合的时代,这样子不好。
上面的理解是对的吗?对于Oracle的小伙伴来说,是对的。把达梦理解成一个单用户单模式的数据库即可。但,实际上,这个又不太对:
- 实际上,达梦上面,承载业务逻辑的不是用户,而是模式,我们在新建用户时,系统会自动新建一个和用户名相同的模式,我们所有的操作,都是在“模式”中。
- 而且,达梦一个用户,是可以对应多个模式的(当我们要实现,在一个连接中,切换模式,那么就必须使用单用户多模式的方法)。
多模式怎么使用?
直接使用对应用户新建模式即可,比如:
sysdba
登录数据库,直接执行create schema schema1
;或者create schema schema2 AUTHORIZATION sysdba
;
就可以为用户sysdba
,额外新建 schema1
和 schema2
两个模式。
注意:经过上面的操作,sysdba
这个用户,就有3个模式了,sysdba
、schema1
、schema2
。
经典用法-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 | SELECT |
摘录的原帖地址:对达梦数据库用户和模式的理解