注册
对达梦数据库用户和模式的理解

对达梦数据库用户和模式的理解

hql 2021/09/24 9754 19 4
摘要 我们所说的配置登录默认模式、模式切换,都是某一个用户自己建立的多个模式之间切换,模式和用户不存在授权的概念,也不能授权,只有属于和不属于;同时,我们所有的模式切换,是不能跨到其他用户下面去的。

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

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

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

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

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

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

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

多模式怎么使用?

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

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

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

经典用法1-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这个模式名);同理,如果要访问其他模式,肯定是必须加模式名的。

经典用法2-驱动配置默认登录模式

参考DM8-程序员手册第四章,DM JDBC编程指南的表 4.1 JDBC 连接串属性

属性名称 说明 是否必须设置
schema 指定用户登录后的当前模式,默认为用户的默认模式

例子:jdbc:dm://192.168.0.96:5236?LobMode=1&schema=schema_name

注意:使用这个连接串登录的的用户名,必须是user1,这个&schema=schema_name设置才有效。也就是说,如果这类使用的userxx登录的,想设置成不是自己用户的schema,可不可以?—— 不可以!

经典问题3-模式本身是没有权限概念的

另外,模式本身也是没有权限概念的。也就是说,一个用户,可以有一个或者多个模式。一个模式一定有一个唯一的所有者。

  1. 你都是所有者了,自然不存在还需要赋权的说法。
  2. 能不能把某个模式,赋权给其他用户?—— 也是不可以的,自己的就只能是自己的。(当然,其他用户可以通过获取 dba权限或者select any table权限,获取到对应表的访问权限,但是这个和这个模式没有必然关系,它是直接穿透所有模式了——所以说,这里也不是把模式授权的概念)即:模式和授权,是两个不会出现到一起的名词。

经典问题4-我们如何查询当前模式下的表

我们经常会这么查询某个表是否存在:

SELECT 1 FROM ( SELECT OBJECT_NAME TABLE_NAME, CREATED CREATE_TIME FROM USER_OBJECTS WHERE OBJECT_TYPE='TABLE' OR OBJECT_TYPE='VIEW' ) WHERE TABLE_NAME = 'TAB1';

这个SQL在单用户单模式下,是可行的;

在单用户多模式下,是不可行的,比如:
SYSDBA登录后,执行下面代码:

create schema t1; create schema t2; create table t1.TAB1(v1 int); create table t2.TAB1(v1 int);

在查询上面的SQL时,可以查到两行记录,这个时候,实际上,我们需要修改成下面的SQL:

SELECT 1 FROM ( SELECT SCH.NAME SCHEMA_NAME, OBJ.NAME TABLE_NAME , OBJ.CRTDATE CREATE_TIME FROM SYSOBJECTS SCH, SYSOBJECTS OBJ WHERE SCH.ID =OBJ.SCHID AND OBJ.SUBTYPE$ IN ('UTAB', 'VIEW') AND SCH.NAME =SF_GET_SCHEMA_NAME_BY_ID(CURRENT_SCHID) ) WHERE TABLE_NAME = 'TAB1';

经典问题5-模式切换

通过执行语句的方式:(在SQL里)
set schema schema_name;
说明:如果schema_name是我们的登陆用户的一个模式的话,可以通过这个SQL完成模式切换。

通过接口实现:(在代码里)
通过setSchema
image.png
image.png

注意:再怎么Set,这个也是连接上的切换,也只是在一个用户下的多个模式之间切换而已。

模式问答

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

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

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

如果是从Oracle迁移过来的,请大家保持单用户单模式的使用模式。
1)先为Oracle的每一个用户,都在达梦上,先建立好对应的用户,再迁移数据。
2)忘掉模式的概念,眼里只有用户。

  1. 达梦的模式和Mysql的库有什么区别?如何理解

如果是从Mysql迁移过来的,一般也请大家保持单用户单模式的使用模式。
1)先为Mysql的每一个库名,都在达梦上,先建立好对应的用户,再迁移数据。
2)忘掉模式的概念,眼里只有用户。

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

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

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

  1. 在单用户多模式下,怎么查询自己当前模式下的对象?
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);
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服