非常重要的一句话:
我们所说的配置登录默认模式、模式切换,都是某一个用户自己建立的多个模式之间切换,模式和用户不存在授权的概念,也不能授权,只有属于和不属于;同时,我们所有的模式切换,是不能跨到其他用户下面去的;
达梦的用户,是数据库实例里一个逻辑概念。它是一个操作空间、一个逻辑空间,在这个空间内,可以建立表结构,部署应用。
比如说,一个数据库实例上,我们新建2个用户,每个用户独立部署一个应用系统。
说明:1)当然,也可能是新建2用户,每个用户独立部署一个模块(每个模块,有自己独立的一套表结构)。
2)大家尽量不要在一个实例中,攒太多的系统;低耦合的时代,这样子不好。
上面的理解是对的吗?对于Oracle的小伙伴来说,是对的。把达梦理解成一个单用户单模式的数据库即可。但,实际上,这个又不太对:
1)实际上,达梦上面,承载业务逻辑的不是用户,而是模式,我们在新建用户时,系统会自动新建一个和用户名相同的模式,我们所有的操作,都是在“模式”中。
2)而且,达梦一个用户,是可以对应多个模式的(当我们要实现,在一个连接中,切换模式,那么就必须使用单用户多模式的方法)
直接使用对应用户新建模式即可,比如:
sysdba登录数据库,直接执行create schema schema1;或者create schema schema2 AUTHORIZATION sysdba;
就可以为用户sysdba,额外新建 schema1 和 schema2 两个模式。
注意:经过上面的操作,sysdba这个用户,就有3个模式了,sysdba、schema1、schema2.
如果我们碰到这个问题:select * from schema_name.tablename;
开发的同事问,能不能执行的时候,不带schema_name.,直接写成select * from tablename;
这个是可以的,但又不是完全可以,比如:
如果我们新建 schema_name 这个用户,那么我们使用 schema_name 这个用户登录时,语句里涉及到的表,都会默认带上 schema_name. 这个头缀(这么理解,是比较形象的)
是可以的。
要求:必须新建同名用户后,再迁移数据。
说明:这里既然是“默认带上”,那么后面这句话就好理解了 —— 所有的其他模式(不管是这个用户下的,还是不是这个用户下的对象,如果要访问,就必须通过 模式名.对象名,才可以访问到 —— 这是理所当然的,如果这个也可以省略,那多个模式下的同名对象那不弄混了)
我们也可以新建用户user1(系统自动生成了user1这个同名模式),可以直接为user1新建一个 schema_name的模式,那么在配置jdbc连接属性的时候,可以指定 schema的属性=schema_name,也可以实现上面的效果(sql语句不用加这schema_name这个模式名);同理,如果要访问其他模式,肯定是必须加模式名的。
参考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,可不可以?—— 不可以!
另外,模式本身也是没有权限概念的。也就是说,一个用户,可以有一个或者多个模式。一个模式一定有一个唯一的所有者。
我们经常会这么查询某个表是否存在:
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';
通过执行语句的方式:(在SQL里)
set schema schema_name;
说明:如果schema_name是我们的登陆用户的一个模式的话,可以通过这个SQL完成模式切换。
通过接口实现:(在代码里)
通过setSchema
注意:再怎么Set,这个也是连接上的切换,也只是在一个用户下的多个模式之间切换而已。
模式没有自己的权限,我们不可以给某个用户授权模式权限(模式和权限,基本上不太会出现在同一句话里)
如果是从Oracle迁移过来的,请大家保持单用户单模式的使用模式。
1)先为Oracle的每一个用户,都在达梦上,先建立好对应的用户,再迁移数据。
2)忘掉模式的概念,眼里只有用户。
如果是从Mysql迁移过来的,一般也请大家保持单用户单模式的使用模式。
1)先为Mysql的每一个库名,都在达梦上,先建立好对应的用户,再迁移数据。
2)忘掉模式的概念,眼里只有用户。
如果,我们有业务需要在同一个连接中切换库名(Mysql支持),那就不能按照上面 库->用户的方式迁移了,必须把这些需要切换的库名,设计成达梦上同一个用户下的多个模式。(重要)
可以,jdbc连接串的属性可以指定。
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);
文章
阅读量
获赞