达梦数据库,写SQL如何才能不带上模式名?

本文详细解释了在DM数据库中为何需要通过模式名访问SQL的原因,对比Mysql和SQLSERVER的架构,阐述了达梦数据库的单库多实例体系,并提供了创建用户、表空间及迁移数据库的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经常有朋友问到在DM数据库里面,为何SQL要加上模式名(数据库名)访问呢?

其实这是把Mysql或者SQLSERVER的思维代入DM数据库造成的,Mysql的

体系架构是单实例多库的,一个用户可以访问多个数据库,然后指定当前数据库写

SQL的时候就不用带上数据库名了。

     达梦的体系架构是单库多实例的,也就是没有多个数据库的概念了,从Mysql或者

SQLSERVER转到达梦,就需要建多个用户+表空间来对应Mysql的多个数据库。

例如MYSQL中有TESTDB1,TESTDB2两个库,都用root用户来访问,在达梦中第一步

就创建两个表空间:

CREATE TABLESPACE TESTDB1 DATAFILE 'TESTDB1.DBF' SIZE 128;
CREATE TABLESPACE TESTDB2 DATAFILE 'TESTDB2.DBF' SIZE 128;

第二步创建两个用户,授予对应的权限:

--以下SQL用SYSDBA用户登录执行

CREATE USER TESTDB1 IDENTIFIED BY "123456789" DEFAULT TABLESPACE TESTDB1;

CREATE USER TESTDB2 IDENTIFIED BY "123456789" DEFAULT TABLESPACE TESTDB2;

GRANT RESOURCE TO TESTDB1;

GRANT RESOURCE TO TESTDB2;

 

第三步:迁移Mysql TESTDB1数据库里面的表,数据库迁移工具就使用TESTDB1用户来迁移

              迁移Mysql TESTDB2数据库里面的表,数据库迁移工具就使用TESTDB2用户来迁移

第四步:访问TESTDB1用户(模式)下的表,就使用TESTDB1用户登录来访问,就不需要加模式名TESTDB1

 

如果要用JDBC来访问数据库,设置如下:

jdbc.driver=dm.jdbc.driver.DmDriver
jdbc.url=jdbc:dm://127.0.0.1:5236
jdbc.username=TESTDB1
jdbc.password=123456789

补充说明一下:假设一个用户拥有多个模式,该用户访问自己所属的其他非同名模式下的对象时,如何才能不带模式名呢?

这里以SYSDBA用户为例:

CREATE SCHEMA "TEST" AUTHORIZATION "SYSDBA";

CREATE TABLE TEST.TTTT(C1 INT);

INSERT INTO TEST.TTTT VALUES(1);

COMMIT;

SELECT * FROM TTTT; --会报错

SET SCHEMA TEST;  --切换当前模式为TEST

SELECT * FROM TTTT;  --执行成功

 

更多资讯请上达梦技术社区了解: https://eco.dameng.com

 

### 如何在达梦数据库中设置模式为大小敏感 要在达梦数据库中实现大小敏感的配置,可以通过调整数据库初始化参数以及合理设计 SQL 查询方式完成。以下是具体的方法: #### 1. 初始化数据库时禁用大小敏感 当通过 Docker 安装并初始化达梦数据库实例时,可以利用环境变量 `CASE_SENSITIVE` 来控制数据库的大小敏感性。将该值设为 `0` 即可关闭大小敏感功能。 ```bash docker run \ -e CASE_SENSITIVE=0 \ # 关闭大小敏感 -e UNICODE_FLAG=1 \ # 启用 Unicode 支持 -e CHARSET=1 \ # 设置字符集 -e PAGE_SIZE=16 \ # 数据库页面大小 -e LD_LIBRARY_PATH=/opt/dmdbms/bin \ -e INSTANCE_NAME=dm8 \ # 实例称 -d dameng/database:latest ``` 上述命令中的 `-e CASE_SENSITIVE=0` 是核心部分,用于指定数据库运行时区分大小[^2]。 #### 2. 表对象默认转换为大 如果未显式开启大小敏感模式,则达梦数据库会自动将表和字段统一转换为大字母形式存储。这意味着,在执行查询操作时无需考虑原始定义中的大小差异,只需按照大的约定书即可正常访问数据[^3]。 例如: ```sql SELECT NAME, AGE FROM STUDENT; ``` 即使实际创建的是小 `student` 和字段 `(name, age)` ,以上语句仍能成功执行,因为内部已标准化为全部大处理[^1]。 #### 3. 使用双引号强制保留原样命 需要注意的是,一旦某张表或者某个字段被用带双引号的方式声明过之后,再对其进行引用就必须严格匹配原来的大小状态,并且继续包裹于双引号之中;否则将会引发错误提示找到对应的目标实体[^4]。因此建议除非必要情况下才采用这种方式设定特殊的字格式,否则一般推荐让系统自行管理好这些细节从而简化日常维护工作量。 综上所述,要使整个模式变为完全忽略字母case的区别对待的话,最简单有效途径就是在最初部署阶段就明确指定了非sensitive选项即`CASE_SENSITIVE=0`,这样后续所有的交互过程都必额外顾虑这方面因素影响效率与准确性了。 ```python # Python连接示例代码片段展示如何基于已经配置好的无Case区别的DM Server来进行基本的数据检索活动。 import pymssql conn = pymssql.connect(server='localhost', user='sa', password='your_password', database='testdb') cursor = conn.cursor() try: cursor.execute("SELECT name, age FROM Student") # 需关心 student 或者 Name/AGE 的确切拼法 row = cursor.fetchone() while row: print(f"Name={row[0]} Age={row[1]}") row = cursor.fetchone() finally: conn.close() ```
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值