达梦数据库对象管理
达梦数据库对象管理学习笔记从模式、表到权限的完整梳理来源总览本文主要参考03_doc/DM8系统管理员手册.md第 8 章“管理模式对象的空间”、第 13 章“模式对象的常规管理”、第 14 章“数据库布局和存储管理”03_doc/DM8_SQL语言使用手册.md第 3 章数据定义语句、第 6 章视图、第 7 章物化视图、第 14 章触发器、第 15 章同义词03_doc/DM8安全管理.md第 3 章“自主访问控制”。一、整体认识数据库对象到底是什么数据库对象不是一个单一概念。站在 DBA 或开发人员的角度看所谓对象管理其实是在管理数据库里一批“有名字、有归属、有权限、有依赖关系”的东西。在 DM 中模式对象主要包括类型典型对象主要作用数据承载对象表、临时表、分区表、HUGE 表存放业务数据访问加速对象索引、全文索引、位图索引提高查询效率逻辑封装对象视图、物化视图、同义词简化访问、隔离细节程序对象触发器、过程、函数、包封装业务逻辑或自动动作生成类对象序列生成连续或近似连续的数值安全相关对象用户、角色、权限控制谁能做什么存储相关对象表空间、数据文件决定对象数据落到哪里官方手册里有一个很关键的区分表、视图、索引、触发器、存储过程、序列、同义词等属于“模式对象”用户、角色、权限、表空间属于“非模式对象”。这个区分非常重要因为它决定了对象命名、访问路径和权限控制方式。可以用一句话理解模式对象是业务对象和 SQL 对象的主体非模式对象是支撑这些对象被创建、存储和访问的管理结构。比如一张业务表SALES.ORDER_INFOSALES是模式名。ORDER_INFO是表对象。表中的数据实际存放在某个表空间的数据文件里。用户要访问它需要有SALES.ORDER_INFO上的对象权限或者拥有更高层级的数据库权限。如果这张表上有索引、触发器、视图、外键它还会和其他对象形成依赖关系。所以对象管理不是简单的CREATE和DROP而是要同时考虑命名空间、存储、权限和依赖。二、模式对象管理的第一层命名空间模式可以理解为数据库对象的命名空间。一个模式下面可以有表、视图、索引、序列、过程、同义词等对象。DM 中系统会为每个用户自动建立一个与用户名同名的默认模式。比如创建用户U_APP后通常也会有一个默认模式U_APP。如果用户在没有显式指定模式名的情况下创建表表一般会落到当前模式下。CREATEUSERU_APP IDENTIFIEDBYU_APP_123;-- 登录 U_APP 后如果当前模式为 U_APPCREATETABLET_ORDER(IDINT,ORDER_NOVARCHAR(50));-- 这张表可以理解为 U_APP.T_ORDERSELECT*FROMU_APP.T_ORDER;访问对象时建议养成显式写模式名的习惯尤其是在脚本、迁移、授权、排查环境中。SELECT*FROMDMHR.EMPLOYEE;SELECT*FROMSYSDBA.T_TEST;这样做的好处是减少歧义。因为不同模式下可以存在同名对象例如U_APP.T_CONFIG U_REPORT.T_CONFIG如果只写T_CONFIG数据库会按当前模式和对象解析规则去找。学习阶段可能不觉得有问题但到了多用户、多模式、迁移或权限排查场景不写模式名会让问题变得难判断。CREATE SCHEMA 不只是建一个空模式手册里提到CREATE SCHEMA可以创建空模式也可以在创建模式时一起创建多个模式对象。例如CREATESCHEMATESTCREATESEQUENCE ADDRESS_SEQ INCREMENTBY1CREATETABLEADDRESS(ADDRESSIDINT,ADDRESS1VARCHAR(60)NOTNULL,CITYVARCHAR(30)NOTNULL,POSTALCODEVARCHAR(15)NOTNULL)CREATETABLEADDRESS_TYPE(ADDRESS_TYPEIDINTPRIMARYKEY,NAMEVARCHAR(50)NOTNULL);这说明模式不是“用户本身”而是对象集合。一个用户可以创建多个模式一个模式里的对象也可以被多个有权限的用户访问。当前模式和对象解析在 SQL 中模式名.对象名是最清晰的引用方式。如果没有写模式名DM 会在当前模式下查找对象。-- 设置当前模式SETSCHEMATEST;-- 等价于访问 TEST.ADDRESSSELECT*FROMADDRESS;这里有一个容易混淆的点SQL 语句对象解析和 DMSQL 程序对象解析不完全一样。系统管理员手册中提到在 SQL 语句里A.B优先按“模式.对象”解析而在 DMSQL 程序里A.B可能优先按“本模式下包.对象”解析。写程序对象时命名要尽量避免包名、模式名、对象名互相打架。三、表数据库对象管理的核心表是对象管理中最核心的对象因为大多数索引、视图、物化视图、触发器、权限和统计信息最终都围绕表展开。一张表至少要考虑这些内容表属于哪个模式。表放在哪个表空间。列的数据类型是否合适。主键、唯一约束、外键、检查约束是否完整。是否需要分区、临时表或 HUGE 表。后续查询是否需要索引和统计信息。谁可以查询、插入、修改或删除这张表。一个普通表可以这样创建CREATETABLEAPP_ORDER(IDINTPRIMARYKEY,ORDER_NOVARCHAR(50)NOTNULL,CUSTOMER_NAMEVARCHAR(100),AMOUNTDECIMAL(18,2),CREATE_TIMEDATETIMEDEFAULTSYSDATE);如果要明确模式和表空间可以写得更完整一些CREATETABLEU_APP.APP_ORDER(IDINTPRIMARYKEY,ORDER_NOVARCHAR(50)NOTNULL,CUSTOMER_NAMEVARCHAR(100),AMOUNTDECIMAL(18,2),CREATE_TIMEDATETIMEDEFAULTSYSDATE)TABLESPACEMAIN;表对象后期经常需要调整。ALTER TABLE支持增加列、删除列、修改列类型、增加或删除约束、重命名表或列、移动表空间、启用或禁用约束等。ALTERTABLEU_APP.APP_ORDERADDCOLUMNSTATUSVARCHAR(20)DEFAULTNEW;ALTERTABLEU_APP.APP_ORDERRENAMECOLUMNCUSTOMER_NAMETOCUST_NAME;ALTERTABLEU_APP.APP_ORDERADDCONSTRAINTCK_APP_ORDER_AMOUNTCHECK(AMOUNT0);这里需要注意表结构变更不是孤立操作。比如删除列、改名、删除约束可能影响视图、触发器、过程、外键和应用 SQL。约束比程序判断更靠近数据本身完整性约束用于限制表中的数据。常见约束包括约束作用PRIMARY KEY主键唯一标识一行UNIQUE保证列或列组合唯一NOT NULL不允许为空CHECK按表达式检查数据FOREIGN KEY建立表间引用关系CREATETABLEU_APP.CUSTOMER(IDINTPRIMARYKEY,NAMEVARCHAR(100)NOTNULL,PHONEVARCHAR(30),STATUSVARCHAR(20)CHECK(STATUSIN(ACTIVE,DISABLED)));CREATETABLEU_APP.APP_ORDER(IDINTPRIMARYKEY,CUSTOMER_IDINT,ORDER_NOVARCHAR(50)UNIQUE,AMOUNTDECIMAL(18,2)CHECK(AMOUNT0),CONSTRAINTFK_ORDER_CUSTOMERFOREIGNKEY(CUSTOMER_ID)REFERENCESU_APP.CUSTOMER(ID));约束有启用和禁用状态。导入大量数据、批处理修改或迁移数据时可能会临时禁用某些约束以提高速度但操作结束后应尽快启用并校验。ALTERTABLEU_APP.APP_ORDERDISABLECONSTRAINTCK_APP_ORDER_AMOUNT;ALTERTABLEU_APP.APP_ORDERENABLECONSTRAINTCK_APP_ORDER_AMOUNT;需要记住禁用约束可能让不符合规则的数据进入表中所以不能把它当成普通优化手段随便用。DELETE、TRUNCATE、DROP 的区别对象管理里经常遇到三类“删除”操作删除什么是否保留表结构DELETE删除满足条件的数据行保留TRUNCATE TABLE清空整张表数据保留DROP TABLE删除表对象本身不保留DELETEFROMU_APP.APP_ORDERWHERESTATUSCANCELLED;TRUNCATETABLEU_APP.APP_ORDER;DROPTABLEU_APP.APP_ORDERCASCADE;TRUNCATE通常比DELETE清空全表更快但它不会触发表上的DELETE触发器。DROP TABLE删除表以后表上的索引也会被删除用户在该表上的权限也会自动取消。实际操作时先问自己一句是要删数据还是要删对象如果只是清空数据不要误用DROP。四、表空间和空间管理对象最终要落到存储上模式解决对象“属于谁”和“叫什么”的问题表空间解决对象“放在哪里”的问题。表空间由数据文件组成表和索引等对象的数据最终会落在表空间的数据文件里。创建表空间时要指定数据文件CREATETABLESPACETS_APP DATAFILE/dmdata/DAMENG/TS_APP01.DBFSIZE128;表空间可以通过添加数据文件或扩展已有数据文件来扩容。系统管理员手册中也提到可以通过动态视图查看表空间和数据文件对应关系SELECTts.NAME,df.PATHFROMV$TABLESPACEts,V$DATAFILE dfWHEREts.IDdf.GROUP_ID;对象空间管理还有两个常见问题。第一用户可能有表空间配额限制。如果用户超过指定表空间配额创建表、创建索引或插入更新数据时会报空间不足。CREATEUSERTEST_USER IDENTIFIEDBYTEST_password_123QUOTA50MONTS_APP;ALTERUSERTEST_USER QUOTA100MONTS_APP;第二单个表对象也可以设置磁盘空间限制CREATETABLETEST(SNOINT,MYINFOVARCHAR)DISKSPACELIMIT500;ALTERTABLETESTMODIFYDISKSPACELIMIT50;查看对象空间时可以使用系统函数-- 查看用户占用空间返回页数SELECTUSER_USED_SPACE(TEST_USER);-- 查看表对象占用空间SELECTTABLE_USED_SPACE(SYSDBA,TEST);-- 查看表实际使用页数SELECTTABLE_USED_PAGES(SYSDBA,TEST);这里的学习重点不是背函数而是建立一个意识对象管理一定要和空间管理结合。表建得出来不代表能长期稳定写入索引能提升查询也会占空间分区和表空间规划不合理后期维护会变复杂。五、索引提高查询效率但不是越多越好索引的作用是提高查询效率。官方手册中也提醒索引会降低影响索引列值的INSERT、UPDATE、DELETE执行效率因为数据库不仅要维护表数据还要维护索引数据。最常见的索引创建方式CREATEINDEXIDX_ORDER_NOONU_APP.APP_ORDER(ORDER_NO);CREATEUNIQUEINDEXUK_ORDER_NOONU_APP.APP_ORDER(ORDER_NO);索引适合这些场景经常按某列或某几列过滤。经常按某列排序。表数据量较大全表扫描成本高。查询条件稳定、重复出现。例如订单号经常用于精确查询SELECT*FROMU_APP.APP_ORDERWHEREORDER_NOSO202606120001;这时ORDER_NO上的索引通常有价值。但索引不是越多越好。下面几种情况要谨慎小表上建太多索引收益有限。频繁写入的表上建太多索引会拖慢写入。低选择性的列建普通 B 树索引效果可能不好。经常变化的列建索引维护成本高。对查询条件中频繁使用函数的列普通索引可能用不上。函数索引如果查询经常使用表达式或函数可以考虑函数索引。例如CREATEINDEXIDX_SALES_DIFFONSALES.SALESPERSON(SALESTHISYEAR-SALESLASTYEAR);函数索引适合表达式过滤但也有限制。手册中特别说明函数索引表达式不能包含不确定函数例如SYSDATE、RAND等。如果使用自定义函数函数要具备确定性。可见、不可见、无效和重建DM 支持修改索引状态ALTERINDEXIDX_ORDER_NO INVISIBLE;ALTERINDEXIDX_ORDER_NO VISIBLE;ALTERINDEXIDX_ORDER_NO UNUSABLE;ALTERINDEXIDX_ORDER_NO REBUILD;可以这样理解VISIBLE优化器可以考虑使用这个索引。INVISIBLE优化器不使用这个索引可用于测试去掉索引后的执行计划影响。UNUSABLE索引无效系统不再维护需要REBUILD或重建。REBUILD重建索引让索引恢复有效。生产环境里不建议随便把索引设成无效尤其是主键或唯一约束相关索引。学习和测试环境可以用它理解执行计划和索引维护机制。索引监控手册中提到可以通过MONITORING USAGE监控索引使用情况相关信息可查看V$OBJECT_USAGE。ALTERINDEXIDX_ORDER_NO MONITORINGUSAGE;SELECT*FROMV$OBJECT_USAGE;ALTERINDEXIDX_ORDER_NO NOMONITORINGUSAGE;这对清理无效索引很有帮助。很多系统运行久了以后会积累一些“看起来重要但没人用”的索引。是否删除索引不能只凭感觉最好结合执行计划、监控结果、业务 SQL 和变更窗口综合判断。六、统计信息让优化器更了解数据索引解决的是访问路径问题统计信息解决的是优化器判断成本的问题。优化器要决定走索引还是全表扫描、先连接哪张表、使用什么连接方式都需要了解表的数据量、列分布、索引情况。如果统计信息过旧执行计划就可能不理想。DM 支持为表、列和索引生成统计信息。为表生成统计信息STATONSYS.SYSOBJECTS;为列生成统计信息指定采样率STAT30ONSYS.SYSOBJECTS(ID);为索引生成统计信息STAT50ONINDEXPURCHASING.S1;也可以指定并行度STAT/* PARALLEL(12) */ONSYS.SYSOBJECTS;需要注意手册中明确说明STAT语句会导致当前事务提交。因此不要在复杂事务中随手执行统计信息收集。创建索引只是给数据库提供一条可能的路统计信息则帮助数据库判断这条路值不值得走。表数据变化明显之后如果查询计划异常除了看索引也要想到统计信息。七、视图把复杂查询包装成稳定入口视图是从一个或几个基表或视图导出的虚表。它不直接存放数据数据仍然存放在基表中。查询视图时数据库会根据视图定义去访问底层对象。CREATEVIEWU_APP.V_ORDER_VALIDASSELECTID,ORDER_NO,CUSTOMER_ID,AMOUNT,CREATE_TIMEFROMU_APP.APP_ORDERWHERESTATUSCANCELLED;视图的价值主要有三点简化查询。把复杂查询封装起来调用方只查视图。隔离结构变化。底层表变化时可以通过视图维持对外结构相对稳定。控制数据暴露。只暴露用户需要看到的列和行。比如不希望报表用户看到订单内部状态字段可以只授权查询视图CREATEVIEWU_APP.V_ORDER_REPORTASSELECTORDER_NO,CUSTOMER_ID,AMOUNT,CREATE_TIMEFROMU_APP.APP_ORDER;GRANTSELECTONU_APP.V_ORDER_REPORTTOU_REPORT;WITH CHECK OPTION可更新视图可以使用WITH CHECK OPTION限制通过视图写入的数据必须满足视图条件。CREATEVIEWU_APP.V_ORDER_POSITIVEASSELECTID,ORDER_NO,AMOUNTFROMU_APP.APP_ORDERWHEREAMOUNT0WITHCHECKOPTION;这样通过视图插入或更新数据时必须满足AMOUNT 0。它适合把“只允许操作某个范围内的数据”放到视图层控制。视图依赖和重编译视图依赖于基表或其他视图。如果基表删除列、改列名、权限变化视图可能失效。可以通过编译视图检查合法性ALTERVIEWU_APP.V_ORDER_REPORT COMPILE;八、物化视图用空间换查询速度普通视图不存放数据物化视图会存放查询结果。可以把物化视图理解成“带刷新机制的查询结果表”。官方手册中提到创建物化视图时会产生两个字典对象物化视图和物化视图表。物化视图表用于存放真实数据。CREATEMATERIALIZEDVIEWU_APP.MV_ORDER_DAILY REFRESH COMPLETEONDEMANDASSELECTCAST(CREATE_TIMEASDATE)ASORDER_DATE,COUNT(*)ASORDER_COUNT,SUM(AMOUNT)ASTOTAL_AMOUNTFROMU_APP.APP_ORDERGROUPBYCAST(CREATE_TIMEASDATE);刷新物化视图REFRESH MATERIALIZEDVIEWU_APP.MV_ORDER_DAILY COMPLETE;物化视图适合这些场景聚合查询很重实时性要求不高。报表反复查询同一批统计结果。底层表很大直接汇总成本高。物化视图也有代价占用额外存储空间。需要刷新刷新会消耗资源。快速刷新有较多限制通常还需要物化视图日志。底层表发生TRUNCATE、快速装载、分区交换等操作后可能需要先完全刷新。所以物化视图不能简单理解为“高级视图”。它更像一个维护成本更高、但能显著减少重复查询成本的对象。九、序列生成主键值但不要误解为严格连续序列是数据库实体用于生成唯一整数值常用于主键或业务编号的一部分。CREATESEQUENCE U_APP.SEQ_ORDER_IDSTARTWITH1INCREMENTBY1NOCYCLE CACHE20;使用序列INSERTINTOU_APP.APP_ORDER(ID,ORDER_NO,AMOUNT)VALUES(U_APP.SEQ_ORDER_ID.NEXTVAL,SO202606120001,100);常见伪列伪列含义NEXTVAL生成并返回下一个序列值CURRVAL返回当前会话已经获取过的当前序列值使用CURRVAL前一般要先在当前会话调用过NEXTVAL。序列的几个参数很重要INCREMENT BY步长可以为正或负但不能为 0。START WITH起始值。MAXVALUE/MINVALUE最大值和最小值。CYCLE/NOCYCLE达到边界后是否循环。CACHE/NOCACHE是否预分配缓存值。ORDER/NOORDER是否保证请求顺序。学习序列时要特别注意序列常用于生成唯一值但不一定适合做严格无间断编号。因为缓存、事务回滚、失败重试等情况都可能造成序列值跳号。如果业务要求票据号严格连续应单独设计编号机制而不是直接依赖普通序列。修改序列ALTERSEQUENCE U_APP.SEQ_ORDER_ID INCREMENTBY10;ALTERSEQUENCE U_APP.SEQ_ORDER_IDCURRENTVALUE1000;ALTERSEQUENCE U_APP.SEQ_ORDER_IDRENAMETOSEQ_ORDER_ID_NEW;删除序列DROPSEQUENCE U_APP.SEQ_ORDER_ID_NEW;十、同义词给对象起别名降低访问复杂度同义词可以给数据库对象提供别名。它可以隐藏对象真实名字和拥有者也可以简化跨模式访问。CREATESYNONYM U_APP.S_ORDERFORU_APP.APP_ORDER;SELECT*FROMU_APP.S_ORDER;同义词分为全局同义词和非全局同义词-- 非全局同义词CREATESYNONYM U_REPORT.S_ORDERFORU_APP.APP_ORDER;-- 全局同义词CREATEPUBLICSYNONYM S_ORDER_PUBLICFORU_APP.APP_ORDER;同义词的好处简化长对象名。降低应用 SQL 对具体模式名的依赖。对远程对象访问提供一定位置透明性。在迁移或重构时可以通过同义词减少 SQL 改动。但同义词也容易隐藏问题。手册中特别说明同义词创建时不会检查它指向的对象是否存在使用时如果目标对象不存在或没有权限才会报错。CREATESYNONYM U_APP.S_NOT_EXISTSFORU_OTHER.T_NOT_EXISTS;-- 创建可能成功但查询时报错SELECT*FROMU_APP.S_NOT_EXISTS;因此同义词适合做访问入口简化不适合掩盖混乱的对象归属。命名和文档仍然要清楚。删除同义词DROPSYNONYM U_REPORT.S_ORDER;DROPPUBLICSYNONYM S_ORDER_PUBLIC;如果删除全局同义词必须指定PUBLIC因为全局同义词和非全局同义词可以同名。十一、触发器自动执行逻辑但要克制使用触发器是在特定数据库事件发生时自动执行的程序对象。常见的是表触发器例如在插入、更新、删除前后执行某段逻辑。CREATEORREPLACETRIGGERU_APP.TRG_ORDER_BI BEFOREINSERTONU_APP.APP_ORDERFOR EACH ROWBEGINIF:NEW.CREATE_TIMEISNULLTHEN:NEW.CREATE_TIME :SYSDATE;ENDIF;END;/触发器可以用于审计某些复杂操作。维护复杂数据完整性。自动生成字段值。做某些安全检查。但官方手册也提醒了触发器使用原则。能用完整性约束完成的不建议用触发器替代。原因很简单约束更简单、更稳定也更容易被数据库保证。触发器隐藏在 DML 背后写多了以后会让应用行为变得难预测。触发器可以启用或禁用ALTERTRIGGERU_APP.TRG_ORDER_BIDISABLE;ALTERTRIGGERU_APP.TRG_ORDER_BIENABLE;也可以重新编译ALTERTRIGGERU_APP.TRG_ORDER_BI COMPILE;大量数据导入时有时会临时禁用触发器以提升速度但导入结束后要及时启用并验证数据是否符合预期。十二、权限对象建好了还要控制谁能访问对象管理离不开权限。DM 安全管理手册里把权限分为两类数据库权限和对象权限。类型控制范围示例数据库权限能不能执行某类数据库级操作CREATE TABLE、CREATE VIEW、CREATE USER对象权限能不能访问某个具体对象SELECT ON 表、UPDATE ON 表、EXECUTE ON 过程数据库权限示例GRANTCREATETABLETOU_APP;GRANTCREATEVIEWTOU_APP;对象权限示例GRANTSELECTONU_APP.APP_ORDERTOU_REPORT;GRANTSELECT,INSERT,UPDATEONU_APP.APP_ORDERTOU_DEV;如果允许用户继续把权限转授给别人可以加WITH GRANT OPTIONGRANTSELECTONU_APP.APP_ORDERTOU_REPORTWITHGRANTOPTION;回收权限REVOKESELECTONU_APP.APP_ORDERFROMU_REPORT;如果之前授予了转授权限回收时可能需要CASCADEREVOKESELECTONU_APP.APP_ORDERFROMU_REPORTCASCADE;角色批量管理权限角色是一组权限的组合。与其给每个用户重复授权不如先创建角色再把角色授予用户。CREATEROLE R_ORDER_QUERY;GRANTSELECTONU_APP.APP_ORDERTOR_ORDER_QUERY;GRANTR_ORDER_QUERYTOU_REPORT;这样后续如果报表用户越来越多只要把R_ORDER_QUERY授予新用户即可。权限要调整时也优先调整角色减少重复授权带来的混乱。模式级权限DM 还支持模式权限即模式级别的对象ANY权限但需要开启相关 INI 参数。比如GRANTSELECTANYTABLEONSCHEMAUSER227TOUSER228;这表示让USER228能查询USER227模式下的任意表。这个能力很强应当谨慎使用。对普通业务账号优先采用具体对象授权或角色授权避免权限范围过大。十三、对象依赖改名、删除前先想清楚影响面对象之间会有依赖关系。视图依赖表触发器依赖表过程可能依赖表和视图外键依赖主键或唯一约束。同义词虽然只是别名但目标对象变化后使用同义词的 SQL 也会受影响。系统管理员手册中提到重命名模式对象时要注意如果删除原对象再重建原对象上的授权会失效需要重新授权。如果用ALTER ... RENAME基于原对象的权限会转移到新对象上。依赖该对象的视图和 DMSQL 语句块可能失效需要重新编译。基于该对象的同义词在使用时可能报错。例如ALTERTABLEU_APP.APP_ORDERRENAMETOAPP_ORDER_OLD;这条语句本身很简单但它影响的可能不只是表名应用 SQL 是否写死了原表名视图是否依赖原表过程、函数、包是否引用原表同义词是否指向原表权限是否仍然符合预期删除对象更要谨慎。很多DROP语句都支持CASCADE但CASCADE的含义是连带处理依赖关系不是“更强力、更方便”的普通删除。我的习惯是删除前先查依赖改名前先查引用操作后再编译相关对象。十四、数据字典对象排查不能只靠记忆对象管理最后一定会落到数据字典和系统视图。系统管理员手册提到模式对象的信息主要记录在SYSOBJECTS系统表中SELECT*FROMSYSOBJECTSWHERETYPE$SCHOBJORTYPE$TABOBJ;但SYSOBJECTS不能保存所有细节还要结合其他系统表。例如要查什么可关注对象模式对象基本信息SYSOBJECTS索引详细信息SYSINDEXES约束信息SYSCONS过程、函数、视图定义文本SYSTEXTS物化视图信息SYS.USER_MVIEWS表空间信息V$TABLESPACE数据文件信息V$DATAFILE权限列表V$AUTHORITIES索引使用监控V$OBJECT_USAGE查看视图定义时可以查询SYSOBJECTS和SYSTEXTS也可以使用系统过程CALLSP_VIEWDEF(SYSDBA,VIEW1);排查对象问题时我会按这个顺序走对象是否存在。对象属于哪个模式。当前用户是否有权限。对象是否有效。是否存在依赖对象。是否有同义词、视图或过程间接引用。表空间和数据文件是否正常。这比直接问“为什么查不到表”更有效。很多时候问题不是表不存在而是当前模式不对、权限不够、同义词指错、对象失效或表空间异常。十五、学习总结达梦数据库的对象管理表面上看是各种CREATE、ALTER、DROP语句真正学起来要把它看成一个体系。我的理解可以总结成四句话模式负责组织对象表空间负责承载数据。表是核心对象索引、视图、触发器、序列、同义词大多围绕表展开。权限决定对象能否被访问角色让权限管理更容易维护。改名、删除、迁移对象前要先考虑依赖、授权、统计信息和数据字典。后续继续深入时可以围绕三个方向扩展对象依赖和对象失效后的重编译机制。大表、分区表、HUGE 表的空间和索引管理。结合执行计划分析索引和统计信息是否真正生效。对象管理不是只为了会写语法而是为了在真实环境里知道对象在哪里、谁能访问、改动会影响谁、出问题该从哪里查。把这条线理清以后再看备份恢复、迁移同步、性能调优和权限安全都会顺很多。