达梦数据库模式
达梦数据库模式
一、引言
在数据库管理系统中,模式(Schema)是一个重要概念,它为数据库对象的组织、管理和权限控制提供了有效的方式。达梦数据库作为一款优秀的国产数据库,其模式功能有着独特的设计与应用。
二、达梦数据库模式的概念
2.1 模式的定义
在达梦数据库中,模式可以看作是包含表、视图、索引、触发器、存储过程 / 函数等数据库对象的容器。它是一个命名空间,用于将相关的数据库对象进行逻辑分组。从本质上讲,模式为数据库对象提供了一种结构化的组织方式,使得数据库的管理和维护更加清晰和高效。
2.2 模式与用户的关系
达梦数据库为每个用户自动创建一个与用户名同名的默认模式。例如,当创建一个名为 “user1” 的用户时,系统会自动生成一个名为 “user1” 的模式。用户在进行数据库操作时,默认在自己的同名模式下进行。同时,用户也可以创建其他模式来组织特定的数据库对象。这意味着一个用户可以拥有多个模式,而不同用户的模式相互独立,互不干扰。例如,用户 “user1” 可以创建 “schema1” 和 “schema2” 等模式,分别用于存放不同业务相关的数据库对象。
2.3 模式对象与非模式对象
模式主要包含一系列模式对象,如:
-
表:数据存储的基本单元,由行和列组成,用于存储实际的数据记录。
-
视图:基于一个或多个表或其他视图的虚拟表,它不实际存储数据,而是根据定义的查询语句动态生成结果集,提供了一种灵活的数据呈现方式。
-
索引:用于提高数据查询效率,通过对表中的一列或多列建立索引,可以快速定位满足查询条件的数据行。
-
触发器:一种特殊的存储过程,当特定的数据库事件(如插入、更新、删除数据)发生时自动触发执行,用于实现数据的完整性约束和业务逻辑的自动化处理。
-
存储过程 / 函数:一组预编译的 SQL 语句集合,存储在数据库中,可以被多次调用,提高了代码的复用性和执行效率,函数还会返回一个值,而存储过程可以有多个输出参数。
-
序列:用于生成唯一的数值序列,通常用于为表中的主键列生成唯一值。
-
全文索引:专门用于对文本类型数据进行高效的全文搜索,提高文本搜索的速度和准确性。
-
包:将相关的存储过程、函数、变量等组合在一起,形成一个逻辑单元,便于管理和维护。
-
同义词:为数据库对象(如表、视图、存储过程等)创建一个别名,使用同义词可以简化对象的引用,提高代码的可读性和可维护性。
-
类:在面向对象编程与数据库结合的场景中,类用于定义对象的结构和行为,通过类可以创建对象实例并存储在数据库中。
-
外部链接:用于连接外部数据源,使得达梦数据库能够访问和处理外部的数据资源。
而模式对象之外的其他对象统一称为非模式对象,主要包括用户、角色、权限、表空间等。用户是数据库访问的主体,通过角色和权限来获取对数据库对象的操作许可;表空间则用于管理数据库的物理存储结构,一个模式中的对象可以存储在一个或多个表空间中。
三、达梦数据库模式的作用
3.1 实现多用户环境下的数据隔离
在多用户使用同一个数据库的场景中,模式起到了至关重要的数据隔离作用。不同用户的模式相互独立,每个用户只能访问和操作自己模式下的对象(在没有额外权限授予的情况下)。例如,在一个企业级应用中,销售部门的用户和财务部门的用户使用同一个达梦数据库。销售部门的用户在其对应的模式下创建和管理与销售业务相关的表、视图等对象,如 “sales_orders” 表、“sales_report_view” 视图等;财务部门的用户在自己的模式下维护财务相关的对象,如 “financial_statements” 表、“tax_calculation_proc” 存储过程等。这样,两个部门的用户数据不会相互干扰,保证了数据的安全性和完整性。
3.2 便于数据库对象的组织与管理
通过模式,可以将相关的数据库对象按照业务逻辑或功能模块进行分组。例如,在一个大型电商系统中,可以创建 “product_schema” 模式用于存放与商品信息相关的表、视图和存储过程。在该模式下,可以有 “products” 表用于存储商品的基本信息,“product_categories” 表用于定义商品分类,“get_product_details_proc” 存储过程用于获取商品的详细信息。这样的组织方式使得数据库管理员和开发人员能够更清晰地了解数据库的结构,便于进行对象的创建、修改、删除和查询等管理操作。当需要对某个业务模块进行升级或维护时,可以直接定位到对应的模式,减少对其他无关部分的影响。
3.3 有效支持第三方应用集成
在企业信息化建设中,常常需要集成各种第三方应用。使用模式可以将第三方应用所涉及的数据库对象放置在独立的模式中,避免与企业自身的数据库对象发生命名冲突。例如,企业引入了一款客户关系管理(CRM)的第三方应用,该应用需要在数据库中创建一些表、视图和存储过程来存储和处理客户相关数据。可以为该 CRM 应用创建一个专门的 “crm_schema” 模式,将其所有相关的数据库对象都放在这个模式下。这样,即使第三方应用中的对象名称与企业内部已有的对象名称相同,由于处于不同的模式,也不会产生冲突,确保了第三方应用能够顺利集成到企业的数据库环境中,同时不影响企业原有业务系统的正常运行。
3.4 精细化的权限控制
模式为数据库的权限控制提供了更细粒度的管理方式。数据库管理员可以针对不同的模式设置不同的访问权限,从而限制用户只能操作特定模式下的对象。例如,对于一个只读用户 “readonly_user”,可以只授予其对 “report_schema” 模式的查询权限,使其只能查看该模式下的报表相关视图和表,而无法进行任何修改操作。对于开发人员 “developer_user”,可以授予其对 “development_schema” 模式的完全控制权,包括创建、修改和删除对象的权限,以便进行应用程序的开发和测试。通过这种基于模式的权限控制,可以更好地保障数据库的安全性,防止用户误操作或恶意篡改数据。
四、达梦数据库模式的用法
4.1 创建模式
达梦数据库提供了两种创建模式的语法格式:
- 指定模式名和所属用户:
CREATE SCHEMA <模式名> (AUTHORIZATION <用户名>)(\<DDL\_GRANT 子句> {< DDL\_GRANT 子句>});
例如,创建名为 “schema1” 的模式,属于 “SYSDBA” 用户:
CREATE SCHEMA schema1 AUTHORIZATION SYSDBA;
- 仅指定所属用户,模式名与用户名相同:
CREATE SCHEMA AUTHORIZATION <用户名> (\<DDL\_GRANT 子句> {< DDL\_GRANT 子句>});
例如,创建与用户名 “user2” 同名的模式:
CREATE SCHEMA AUTHORIZATION user2;
在创建模式时,需要注意以下几点:
-
如果创建的模式名已存在,系统会跳过创建操作,但会继续执行后续的 DDL 语句(前提是用户有权限执行这些语句)。
-
“AUTHORIZATION” 关键字用于指定模式的所有者,若不指定,默认模式所有者为 “SYSDBA”。
4.2 设置当前模式
可以使用以下语法设置当前模式:
SET SCHEMA <模式名>;
例如,将当前模式从 “SYSDBA” 切换到 “mydb_schema”:
SET SCHEMA mydb\_schema;
设置当前模式后,具有以下作用:
-
当访问当前模式中的对象时,可以省略模式名前缀。例如,如果当前模式为 “mydb_schema”,在查询 “mydb_schema” 模式下的 “employees” 表时,可以直接使用 “SELECT * FROM employees;”,而不需要写成 “SELECT * FROM mydb_schema.employees;”。
-
新建的对象默认属于当前模式。例如,在当前模式为 “mydb_schema” 的情况下,执行 “CREATE TABLE new_table (id INT);” 语句,新建的 “new_table” 表将属于 “mydb_schema” 模式。
4.3 查询当前模式
可以通过以下 SQL 语句查询当前模式:
SELECT SYS\_CONTEXT('USERENV', 'CURRENT\_SCHEMA') AS CURRENT\_SCHEMA;
执行上述语句后,将返回当前的模式名称。例如,当前模式为 “mydb_schema”,则查询结果为:
CURRENT\_SCHEMA\--------------mydb\_schema
4.4 删除模式
删除模式的基本语法如下:
DROP SCHEMA (IF EXISTS) <模式名> (RESTRICT | CASCADE);
其中:
-
“IF EXISTS” 关键字是可选的。如果指定了该关键字,当删除不存在的模式时,不会报错;若不指定,删除不存在的模式会报错。
-
“RESTRICT” 和 “CASCADE” 是两个选项:
-
如果使用 “RESTRICT” 选项(这是默认选项),只有当模式为空(即模式中不包含任何数据库对象)时,删除操作才能成功;否则,当模式中存在对象时,删除操作将失败。
-
如果使用 “CASCADE” 选项,则会将整个模式、模式中的所有对象以及与该模式相关的依赖关系都一并删除。例如,“schema1” 模式下有 “table1” 表、“view1” 视图以及基于 “table1” 的一些存储过程和触发器等对象,使用 “DROP SCHEMA schema1 CASCADE;” 语句将删除 “schema1” 模式及其包含的所有对象和相关依赖。
-
例如,删除模式 “schema1” 及其所有对象,可以使用:
DROP SCHEMA schema1 CASCADE;
若要安全删除模式(即如果模式存在则删除,不存在也不报错),可以使用:
DROP SCHEMA IF EXISTS schema1;
需要注意的是,执行删除模式操作的用户必须具有 “DBA” 权限或是该模式的所有者,否则删除操作将被拒绝。
4.5 在模式中创建和操作对象
在创建了模式之后,可以在模式中创建各种数据库对象,如前面提到的表、视图、索引等。例如,在 “schema1” 模式下创建一个名为 “customers” 的表:
CREATE TABLE schema1.customers (  customer\_id INT PRIMARY KEY,  customer\_name VARCHAR(100),  contact\_number VARCHAR(20));
在向该表插入数据时,也需要指定模式名:
INSERT INTO schema1.customers (customer\_id, customer\_name, contact\_number) VALUES (1, 'John Doe', '123 - 456 - 7890');
如果当前模式已经设置为 “schema1”,则上述操作可以省略模式名前缀,简化为:
CREATE TABLE customers (  customer\_id INT PRIMARY KEY,  customer\_name VARCHAR(100),  contact\_number VARCHAR(20));INSERT INTO customers (customer\_id, customer\_name, contact\_number) VALUES (1, 'John Doe', '123 - 456 - 7890');
对于视图的创建,同样可以在模式中进行。例如,在 “schema1” 模式下创建一个基于 “customers” 表的视图 “active_customers_view”,用于查看活跃客户(假设活跃客户的判断条件是有最近的订单记录,这里假设存在一个 “orders” 表且与 “customers” 表通过 “customer_id” 关联):
CREATE VIEW schema1.active\_customers\_view ASSELECT c.customer\_id, c.customer\_name, c.contact\_numberFROM schema1.customers cJOIN schema1.orders o ON c.customer\_id = o.customer\_idWHERE o.order\_date >= CURDATE() - INTERVAL 30 DAY;
如果当前模式是 “schema1”,也可省略模式名前缀。
创建索引也类似,比如在 “schema1” 模式的 “customers” 表的 “customer_name” 列上创建索引以提高查询该列的性能:
CREATE INDEX idx\_customer\_name ON schema1.customers (customer\_name);
通过这些操作,可以在模式中构建复杂的数据结构和业务逻辑,满足不同应用场景的需求。
五、总结
达梦数据库的模式作为数据库对象的逻辑容器,在数据库管理和应用开发中发挥着不可或缺的作用。通过模式,实现了多用户环境下的数据隔离,方便了数据库对象的组织与管理,支持了第三方应用的集成,并提供了精细化的权限控制。
https://eco.dameng.com/