数据库管理⑩数据字典

Posted DB架构

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库管理⑩数据字典相关的知识,希望对你有一定的参考价值。

 1. 数据字典的概述

数据字典(Data Dictionary)是数据库管理系统中的一个重要组成部分,它是一个存储数据库元数据的集合,包含了数据库中所有对象的定义和描述信息。数据字典可以帮助用户了解数据库中的各种对象和数据结构,以及它们之间的关系和依赖关系。

数据字典通常包含以下信息:

  1. 数据库对象的定义和描述信息,包括表、视图、索引、存储过程、触发器等。

  2. 数据库对象的属性信息,包括对象的名称、类型、大小、创建时间、修改时间等。

  3. 数据库对象之间的关系和依赖关系,包括表之间的关系、视图和表之间的关系、索引和表之间的关系等。

  4. 数据库用户和权限信息,包括用户的名称、角色、权限等。

  5. 数据库参数和配置信息,包括数据库的名称、版本、字符集、时间区域等。

数据字典可以通过SQL查询来访问和管理,也可以通过数据库管理工具来查看和修改。在实际应用中,数据字典可以帮助用户了解数据库的结构和内容,以及进行数据库的管理和维护。同时,还可以通过数据字典来进行数据库的安全审计和性能优化。

如RDBMS架构图所示,Oracle架构主要包括=

​ User Process、Server Process等的Client端+Instance实例+Databases+一些参数文件+密码文件+归档日志文件.

在Oracle数据库中,用户并不能直接访问到数据库文件,而是需要先创建一个数据库实例.数据库实例指的就是操作系统中一系列的进程以及为这些进程所分配的内存块,就是访问Oracle数据库文件的通道.

一个数据库实例包括Shared Pool(共享池),Data Buffer Cache(数据库缓冲区缓存),Redo Log Buffer(重做日志缓冲区)等部分,其中Shared Pool(共享池)又包括Library Cache(库缓存),Data Dictionary Cache(数据字典缓存).

当用户访问数据库文件时,需要先启动一个数据库实例,然后将数据库文件加载到Data Buffer Cache,将数据字典加载到Data Dictionary Cache,之后Server Process会首先访问Data Dictionary Cache,获取到有关数据库表的字段,关键字等元数据信息,然后再访问Data Buffer Cache,读取相关数据.从上述过程中,可以看到在Oracle数据库中,数据字典不仅是管理和查询元数据的工具,还是用户访问数据库文件的基础.

数据字典(Data dictionary)是一种用户可以访问的记录数据库和应用程序元数据(Metadata)的目录.

元数据是指对数据对象(如表、视图、存储过程等)的描述,包括数据容器的名称、创建时间、创建者或属者、物理存放位置等基础元信息,还包括外部实体、参照完整性等与其他对象的关联信息

数据字典的内容:

1).数据库的逻辑和物理架构

2).用户和对象的定义和存储信息

3).权限、角色、审计等

4).Database**的状态

2. 数据字典的作用

数据字典(Data Dictionary)在数据库管理系统中扮演着重要的角色,它的作用包括以下几个方面:

  1. 数据库对象的描述和定义:数据字典包含了数据库中所有对象的定义和描述信息,包括表、视图、索引、存储过程、触发器等。这些信息可以帮助用户了解数据库中的各种对象和数据结构,以及它们之间的关系和依赖关系

  2. 数据库对象的属性信息:数据字典还包含了数据库对象的属性信息,包括对象的名称、类型、大小、创建时间、修改时间等。这些信息可以帮助用户了解数据库对象的特性和属性,以及进行数据库对象的管理和维护。

  3. 数据库对象之间的关系和依赖关系:数据字典还包含了数据库对象之间的关系和依赖关系,包括表之间的关系、视图和表之间的关系、索引和表之间的关系等。这些信息可以帮助用户了解数据库对象之间的关系和依赖关系,以及进行数据库对象的设计和优化。

  4. 数据库用户和权限信息:数据字典还包含了数据库用户和权限信息,包括用户的名称、角色、权限等。这些信息可以帮助用户了解数据库用户和权限的分配情况,以及进行数据库用户和权限的管理和维护。

  5. 数据库参数和配置信息:数据字典还包含了数据库参数和配置信息,包括数据库的名称、版本、字符集、时间区域等。这些信息可以帮助用户了解数据库的配置和参数设置情况,以及进行数据库的配置和优化。

综上所述,数据字典在数据库管理系统中扮演着重要的角色,它可以帮助用户了解数据库的结构和内容,以及进行数据库的管理和维护。同时,还可以通过数据字典来进行数据库的安全审计和性能优化。

数据字典最重要的作用是作为分析阶段的工具,具体如下:

1.管理系统数据资源

数据字典提供了管理和收集数据的方法;

2.实现数据标准化

数据库中的名称、格式和涵义等在不同的场合下容易混淆,数据字典提供标准化的工具可以赋予其统一的名称、格式和涵义;

3.使系统的描述文体化

所有和系统有关的描述,都可以对数据字典中的信息进行查询、插入、删除和修改;

4.作为设计的工具

由于数据字典中存放着与数据库有关的各种信息和原始资料,就为数据库设计提供了有力的工具;

5.为数据库提供存取控制和管理

数据库在接受存取请求时,都要检查用户标识、口令、子模式、模式和物理模式等.某种意义上讲,数据字典控制了数据库的运行;

6.供数据库管理员(DBA)进行各种查询

以便了解系统性能、空间使用状况和各种统计信息,及时掌握数据库的动态.所以数据字典是 DBA 观察数据库的眼晴和窗口.

3. 数据字典的特点

sys@cdb$root:orclcdb> col table_name format a20
sys@cdb$root:orclcdb> col comments format a30
sys@cdb$root:orclcdb> select * from dict where table_name='DBA_OBJECTS';

TABLE_NAME           COMMENTS
-------------------- ------------------------------
DBA_OBJECTS          All objects in the database

1 row selected.

sys@cdb$root:orclcdb> select count(*) from dict;

  COUNT(*)
----------
      4690

1 row selected.

sys@cdb$root:orclcdb> 

1).central of database(*X$*内部表)

2).read_only table and views

3).owner:sys

4).oracle server维护,DDL操作会更新

5).通过select 访问

6).记录数据库的物理、逻辑结构(tbs)和模式信息及对象信息(用户、约束、权限、审计等)

7).存放在system tablespace (v$来自内存或控制文件)

数据字典(Data Dictionary)是数据库管理系统中的一个重要组成部分,具有以下几个特点:

  1. 统一性:数据字典是一个集中存储数据库元数据的地方,它包含了数据库中所有对象的定义和描述信息。因此,数据字典具有统一性,可以帮助用户了解数据库中各种对象和数据结构的定义和描述信息。

  2. 实时性数据字典中的信息是实时更新的,它可以反映数据库中对象的最新状态和属性信息。因此,用户可以通过数据字典来了解数据库对象的最新状态和属性信息

  3. 可扩展性数据字典可以根据需要进行扩展和修改,以适应不同的应用场景和需求用户可以通过数据字典来进行数据库对象的设计和优化,以及进行数据库的管理和维护

  4. 可访问性数据字典可以通过SQL查询来访问和管理,也可以通过数据库管理工具来查看和修改。因此,用户可以方便地访问和管理数据字典中的信息。

  5. 安全性:数据字典中包含了数据库对象的定义和描述信息,以及数据库用户和权限信息等敏感信息。因此,数据字典具有较高的安全性,需要进行严格的权限控制和访问控制。

综上所述,数据字典具有统一性、实时性、可扩展性、可访问性和安全性等特点,它是数据库管理系统中不可或缺的组成部分,可以帮助用户了解数据库的结构和内容,以及进行数据库的管理和维护。

4. 数据字典的结构

数据字典(Data Dictionary)是数据库管理系统中的一个重要组成部分,它包含了数据库中所有对象的定义和描述信息。数据字典的结构通常包括以下几个方面:

  1. 对象定义信息:数据字典中包含了数据库中所有对象的定义信息,包括表、视图、索引、存储过程、触发器等。这些对象的定义信息包括对象的名称、类型、大小、创建时间、修改时间等。

  2. 对象属性信息:数据字典中还包含了数据库对象的属性信息,包括对象的名称、类型、大小、创建时间、修改时间等。这些信息可以帮助用户了解数据库对象的特性和属性,以及进行数据库对象的管理和维护。

  3. 对象关系信息:数据字典中还包含了数据库对象之间的关系和依赖关系,包括表之间的关系、视图和表之间的关系、索引和表之间的关系等。这些信息可以帮助用户了解数据库对象之间的关系和依赖关系,以及进行数据库对象的设计和优化。

  4. 用户和权限信息:数据字典中还包含了数据库用户和权限信息,包括用户的名称、角色、权限等。这些信息可以帮助用户了解数据库用户和权限的分配情况,以及进行数据库用户和权限的管理和维护。

  5. 参数和配置信息:数据字典中还包含了数据库参数和配置信息,包括数据库的名称、版本、字符集、时间区域等。这些信息可以帮助用户了解数据库的配置和参数设置情况,以及进行数据库的配置和优化。

综上所述,数据字典的结构包括对象定义信息、对象属性信息、对象关系信息、用户和权限信息以及参数和配置信息等方面,它可以帮助用户了解数据库的结构和内容,以及进行数据库的管理和维护。

数据字典(Data Dictionary)是关系型数据库的核心组件之一,在不同的关系型数据库中,数据字典的结构和存储方式有所不同,介绍Oracle数据库数据字典的结构和使用.

Oracle提供了大量的内部表,它们记录了数据库对象的更改和修正.可以将这些内部表划分为两种主要类型: 静态的数据字典表和动态的性能表.这些内部表是由oracle维护的,包括sys都不能修改,只能查看.

Oracle数据字典包括四个层次:X$内部表+动态性能视图+基础数据字典表+静态数据字典视图

动态性能视图静态数据字典视图
l 记录数据库运行时信息和统计数据l 提供给普通用户访问
l 实时更新l 创建数据库时由$ORACLE_HOME/rdbms/admin/catalog.sql创建
l 数据库启动时,基于X$表创建l 根据基础数据字典表创建
l 包括GV$、V$视图l 包括user_、all_、dba_三类
X$部表基础数据字典表
l Oracle数据库的核心部分和运行基础l 存储表、索引、约束以及其他数据库结构信息
l 只有sysdba可以直接访问l 普通用户不能直接访问
l 数据库启动时由Oracle应用程序动态创建X$表l 创建数据库时由$ORACLE_HOME/rdbms/admin/sql.bsq脚本创建
l 包括X$BH、X$KSMSP等l 包括TAB$、OBJ$、TS$等

普通用户不能直接访问X$内部表和基础数据字典表,那么用户如何查看这些表中的信息?

Oracle为用户提供了两个视图:动态性能视图和静态数据字典视图,它们分别是基于X$内部表和基础数据字典表创建的,其中静态数据字典视图包括user_xxx、all_xxx、dba_xxx三类,在创建数据库时由$ORACLE_HOME/rdbms/admin/catagory.sql脚本创建.

5. 结构之--静态数据字典视图

 

user_xxx :存储了关于当前用户所拥有的对象的信息,即所有在该用户模式下的对象;

all_xxx :存储了当前用户能够访问的对象的信息(包括用户所拥有的对象和别的用户授权访问的对象)

dba_xxx :存储了数据库中所有对象的信息, 默认只能有sys/system 用户访问

 NOTE: 实例参数O7_DICTIONARY_ACCESSIBILITY在缺省时为FALSE,这将限制具有select any table权限的非DBA用户访问sys用户下的对象,否则这些非DBA用户也能查看dba_.

让普通用户访问dba_xxx的三种授权方法

-- 第一种	: 将对象权限授予scott
SQL> grant select on dba_objects to scott;
	-- : 收回对象权限
SQL> revoke select on dba_users from scott; 
-- 第二种	: 将系统权限授权给scott
SQL>	grant select any dictionary to scott;
-- 第三种
SQL> grant select any table to scott;	-- 此时,scott除了不能访问dba_xxx,其余均可访问
SQL> alter system set O7_DICTIONARY_ACCESSIBILITY=true scope=spfile;	-- o7的布尔值变为ture,即可达到scott访问任意表,需要重启生效

6. 结构之--动态性能视图

动态视图在数据库mount状态下访问(如控制文件的 v$)

是维护当前实例信息的,由于不断的更新,所以也叫动态视图.其底层是一组虚拟的动态表称为X$表,oracle不允许直接访问X$表,而是在这些表上创建视图,然后再创建这些视图的同义词.

 基表(x$)-------------视图(v_$)--------------同义词v$-------User access

可以通过v$fixed_table 视图查到所有的动态视图的名称;用于调优和数据库监控.

从 Oracle8开始引入GV$视图,含义为Global V$,GV$的产生是为了满足OPS环境的需要,除一些特例,每个V$视图都有一个GV$视图存在.

[oracle@MaxwellDBA ~]$ 
[oracle@MaxwellDBA ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Mon Apr 3 17:46:57 2023
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

sys@cdb$root:orclcdb> 
sys@cdb$root:orclcdb> show user;
USER is "SYS"
sys@cdb$root:orclcdb> select count(*) from v$fixed_table;

  COUNT(*)
----------
      2898

1 row selected.

sys@cdb$root:orclcdb> 


广义概述中:v$也属于数据字典范畴.因为v$的结构也是在创建数据库的时候通过执行脚本完成的.与数据字典视图不同的是:v$数据源不是来自system TBS,而是来自内存或控制文件,它在实例启动后被填充,在实例关闭后被清除.

NOTE

动态性能视图填充了来自实例和控制文件的信息

 前缀为DBA_、ALL_、USER_的视图则填充了来自数据字典的信息,此差异决定了可以在不同的启动阶段查询哪些视图.

(比如在mount阶段, 读完控制文件后, 可以查询大部分视图;但是在 TBS上的静态视图无法查询,因为数据库open时候才可以访问数据字典)

让普通用户访问v$xxx

SQL> grant select on v_$log to scott;  -- 授予scott 用户v_$对象权限

shiro中数据字典管理

一 数据结构

二  代码逻辑

数据字典:是最简单的涉及到单张表的crud操作,其中方法加上了shiro的授权判断

@RequiresPermissions("sys:dict:list")
@RequiresPermissions("sys:dict:info")
@RequiresPermissions("sys:dict:save")
@RequiresPermissions("sys:dict:update")
@RequiresPermissions("sys:dict:delete")

2.1 数据字典的crud操作

package com.debug.pmp.server.controller;

import com.debug.pmp.common.response.BaseResponse;
import com.debug.pmp.common.response.StatusCode;
import com.debug.pmp.common.utils.PageUtil;
import com.debug.pmp.common.utils.ValidatorUtil;
import com.debug.pmp.model.entity.SysDictEntity;
import com.debug.pmp.server.service.SysDictService;
import com.google.common.collect.Maps;
import org.apache.commons.lang.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.Map;

//字典controller
@RestController
@RequestMapping("sys/dict")
public class SysDictController extends AbstractController{

    @Autowired
    private SysDictService sysDictService;

    //列表
    @RequestMapping("/list")
    @RequiresPermissions("sys:dict:list")
    public BaseResponse list(@RequestParam Map<String, Object> params){
        BaseResponse response=new BaseResponse(StatusCode.Success);
        try {
            PageUtil page = sysDictService.queryPage(params);

            Map<String,Object> resMap= Maps.newHashMap();
            resMap.put("page", page);

            response.setData(resMap);
        }catch (Exception e){
            response=new BaseResponse(StatusCode.Fail.getCode(),e.getMessage());
        }
        return response;
    }


    //详情
    @RequestMapping("/info/{id}")
    @RequiresPermissions("sys:dict:info")
    public BaseResponse info(@PathVariable Long id){
        BaseResponse response=new BaseResponse(StatusCode.Success);
        Map<String,Object> resMap=Maps.newHashMap();
        try {
            SysDictEntity entity = sysDictService.getById(id);

            resMap.put("dict", entity);
            response.setData(resMap);
        }catch (Exception e){
            response=new BaseResponse(StatusCode.UpdatePasswordFail);
        }
        return response;
    }

    //新增
    @RequestMapping("/save")
    @RequiresPermissions("sys:dict:save")
    public BaseResponse save(@RequestBody @Validated SysDictEntity dict, BindingResult result){
        String res= ValidatorUtil.checkResult(result);
        if (StringUtils.isNotBlank(res)){
            return new BaseResponse(StatusCode.Fail.getCode(),res);
        }
        BaseResponse response=new BaseResponse(StatusCode.Success);
        try {
            sysDictService.save(dict);

        }catch (Exception e){
            response=new BaseResponse(StatusCode.Fail.getCode(),e.getMessage());
        }
        return response;
    }

    //修改
    @RequestMapping("/update")
    @RequiresPermissions("sys:dict:update")
    public BaseResponse update(@RequestBody @Validated SysDictEntity dict, BindingResult result){
        String res= ValidatorUtil.checkResult(result);
        if (StringUtils.isNotBlank(res)){
            return new BaseResponse(StatusCode.Fail.getCode(),res);
        }
        BaseResponse response=new BaseResponse(StatusCode.Success);
        try {
            sysDictService.updateById(dict);

        }catch (Exception e){
            response=new BaseResponse(StatusCode.Fail.getCode(),e.getMessage());
        }
        return response;
    }

    //删除
    @RequestMapping("/delete")
    @RequiresPermissions("sys:dict:delete")
    public BaseResponse delete(@RequestBody Long[] ids){
        BaseResponse response=new BaseResponse(StatusCode.Success);
        Map<String,Object> resMap= Maps.newHashMap();
        try {
            sysDictService.removeByIds(Arrays.asList(ids));
        }catch (Exception e){
            response=new BaseResponse(StatusCode.Fail.getCode(),e.getMessage());
        }
        return response;
    }

}

 

 

以上是关于数据库管理⑩数据字典的主要内容,如果未能解决你的问题,请参考以下文章

如何用Navicat导出MySQL的数据字典

有啥样的工具,可以自动生成Oracle数据库的数据字典

ORACLE数据库安全基础知识

Oracle导出数据字典SQL语句

oracle重建数据字典会影响业务嘛

Oracle数据字典