- DB2教程
- 首页
- DB2 - 简介
- DB2 - 服务器安装
- DB2 - 实例
- DB2 - 数据库
- DB2 - 缓冲池
- DB2 - 表空间
- DB2 - 存储组
- DB2 - 模式
- DB2 - 数据类型
- DB2 - 表
- DB2 - 别名
- DB2 - 约束
- DB2 - 索引
- DB2 - 触发器
- DB2 - 序列
- DB2 - 视图
- DB2与XML
- DB2 - 备份和恢复
- DB2 - 数据库安全
- DB2 - 角色
- DB2 - LDAP
- DB2有用资源
- DB2 - 问答
- DB2 - 快速指南
- DB2 - 有用资源
- DB2 - 讨论
DB2快速指南
DB2简介
本章介绍DB2的历史、版本、版本及其各自的功能。
概述
DB2是IBM的数据库产品。它是一种关系数据库管理系统(RDBMS)。DB2旨在高效地存储、分析和检索数据。DB2产品扩展了对面向对象功能和带有XML的非关系结构的支持。
历史
最初,IBM为其特定平台开发了DB2产品。从1990年开始,它决定开发一个通用数据库 (UDB) DB2服务器,该服务器可以在任何权威的操作系统(如Linux、UNIX和Windows)上运行。
版本
对于IBM DB2,UDB当前版本为10.5,具有BLU Acceleration功能,其代号为“Kepler”。下面列出了DB2至今的所有版本
版本 | 代号 |
---|---|
3.4 | Cobweb |
8.1, 8.2 | Stinger |
9.1 | Viper |
9.5 | Viper 2 |
9.7 | Cobra |
9.8 | 它仅添加了PureScale功能 |
10.1 | Galileo |
10.5 | Kepler |
数据服务器版本和功能
根据DB2所需功能的要求,组织选择合适的DB2版本。下表显示了DB2服务器版本及其功能
版本 | 功能 |
---|---|
高级企业服务器版和企业服务器版 (AESE / ESE) | 它专为中型到大型商业组织设计。平台 - Linux、UNIX和Windows。表分区高可用性灾难恢复 (HARD) 物化查询表 (MQTs) 多维群集 (MDC) 连接集中器纯XML备份压缩同构联合 |
工作组服务器版 (WSE) | 它专为工作组或中型商业组织设计。使用此WSE,您可以使用 - 高可用性灾难恢复 (HARD) 在线重组纯XML Web服务联合支持DB2同构联合同构SQL复制备份压缩 |
Express -C | 它以零成本提供DB2的所有功能。它可以在任何物理或虚拟系统上以任何大小的配置运行。 |
Express版 | 它专为入门级和中型商业组织设计。它是功能齐全的DB2数据服务器。它仅提供有限的服务。此版本附带 - Web服务联合DB2同构联合同构SQL复制备份压缩 |
企业开发人员版 | 它仅提供单个应用程序开发人员。它可用于设计、构建和原型化应用程序,以便部署到任何IBM服务器上。该软件不能用于开发应用程序。 |
DB2服务器安装
本章介绍DB2服务器的安装步骤。
简介
您可以从www.ibm.com下载DB2服务器试用版或购买产品许可证。有两种单独的DB2服务器可供下载,具体取决于要执行其操作的操作系统的大小。例如,如果要下载适用于32位Linux或UNIX操作系统的DB2服务器,则需要下载32位DB2服务器。64位DB2服务器也适用相同规则。
硬件要求
处理器:至少酷睿2双核
内存:至少1GB
硬盘:至少30GB
软件要求
在安装DB2服务器之前,您的系统需要准备好所需的软件。对于Linux,您需要安装“libstdc++6.0”。
检查系统兼容性
在安装DB2服务器之前,您需要验证您的系统是否与DB2服务器兼容。要确认兼容性,您需要在命令控制台中调用“db2prereqcheck”命令。
在Linux操作系统上安装DB2
打开终端,并使用“CD <DB2安装文件夹>”命令在控制台上设置db2安装映像文件夹路径。然后键入“./db2prereqcheck”命令,该命令确认您的系统与DB2服务器的兼容性。
./db2prereqcheck
图1显示了Linux操作系统和硬件系统的兼容性要求。
按照以下步骤在Linux系统上安装DB2
- 打开终端。
- 以root用户身份登录。
- 打开DB2安装文件夹。
- 键入“./db2setup”并按Enter键。
此过程将开始执行DB2服务器设置。
在root终端上键入“./db2setup”并按Enter键以启动DB2服务器的设置过程。
这样做后,将出现“设置启动板”屏幕。[图2]
在“设置启动板”页面上,从左侧菜单中选择“安装产品”选项。选择“DB2高级企业服务器版”选项。选择“安装新”按钮。
出现一个名为“DB2设置向导”的新框架。单击“下一步”。[图3]
下一个屏幕显示DB2许可协议。选择“我接受条款……”单击“下一步”。[图4]
下一个屏幕显示安装类型,默认情况下设置为“典型”。
保持相同的选择。单击“下一步”。[图5]
下一个屏幕显示安装操作。
选择“安装DB2高级企业服务器版……”
单击“下一步”。[图6]
在下一个屏幕上,设置程序要求选择安装目录。
保持默认值并单击“下一步”。
下一个屏幕显示用户身份验证。输入“dasusr1”用户的密码。
(您的密码可以与用户名相同,以便于记住。)
在以下屏幕上,设置程序要求您创建DB2服务器实例。
在这里,它使用名称“db2inst1”创建DB2实例。
下一个屏幕询问您为默认实例所需的分区数。
您可以选择“单个或多个”分区。
选择“单分区实例”。单击“下一步”。
在下一个屏幕上,设置程序要求您对正在创建的DB2实例进行身份验证。
在这里,默认情况下用户名被创建为“db2inst1”。您可以输入与用户名相同的密码。
单击“下一步”。
在下一个屏幕上,设置程序要求您输入“db2fenc”用户的身份验证信息。
在这里,您可以输入与用户名相同的密码。
单击“下一步”。
在下一个屏幕上,您可以选择“此时不设置您的db2服务器以发送通知”选项。
单击“下一步”。
下一个屏幕显示有关db2设置的信息。
单击“完成”。
此时,DB2安装过程已完成。
验证DB2安装
您需要验证DB2服务器的安装是否有效。完成DB2服务器安装后,退出当前用户模式并登录到“db2inst1”用户。在“db2inst1”用户环境中,您可以打开终端并执行以下命令以验证您的db2产品是否已正确安装。
db2level
此命令显示当前实例中已安装的DB2产品的当前版本和服务级别。
语法
db2level
示例
db2level
输出
DB21085I Instance "db2inst2" uses "64" bits And DB2 code release "SQL10010" with level identifier "0201010E". Informational tokens are "DB2 v10.1.0.0", "s120403", "LINUXAMD64101", and Fix Pack "0". Product is installed at "/home/db2inst2/sqllib".
db2licm
此命令显示我们DB2产品的所有与许可证相关的信息。
语法
db2licm <parameter>
示例
db2licm -l
输出
Product name: "DB2 Advanced Enterprise Server Edition" License type: "Trial" Expiry date: "10/02/2014" Product identifier: "db2aese" Version information: "10.1" Product name: "DB2 Connect Server" License type: "Trial" Expiry date: "10/02/2014" Product identifier: "db2consv" Version information: "10.1"
命令行处理器 (CLP)
CLP可以以三种模式之一启动
命令模式:在此模式下,每个命令和SQL语句都必须以“db2”为前缀。例如,查询“db2 activate database sample”。
交互式输入模式:您可以使用“db2”命令启动此模式。在这里,您可以传递没有前缀的SQL语句。例如,“activate database sample”。
批处理模式:在这里,您需要创建一个包含所有需求SQL查询的脚本文件,并将该文件保存为“.db2”扩展名。您可以使用语法“db2 –tf <filename.db2>”在命令行中调用它。
DB2实例
简介
实例是DB2数据库管理器的逻辑环境。使用实例,您可以管理数据库。根据您的需求,您可以在一台物理机器上创建多个实例。实例目录的内容为
- 数据库管理器配置文件
- 系统数据库目录
- 节点目录
- 节点配置文件 [db2nodes.cfg]
- 调试文件、转储文件
对于DB2数据库服务器,默认实例为“DB2”。创建实例目录后,无法更改其位置。一个实例可以管理多个数据库。在一个实例中,每个数据库都有一个唯一的名称,它自己的一组目录表、配置文件、权限和特权。
DB2产品中实例的架构
多个实例
您可以在Linux、UNIX和Windows上的一台DB2服务器上创建多个实例。可以在物理机器上安装多个DB2服务器。
在Linux上创建实例
如果DB2服务器以root用户身份安装,则您可以在Linux和UNIX上创建多个实例。实例可以在Linux和UNIX上独立同时运行。您一次只能在一个数据库管理器的单个实例中工作。
实例文件夹包含数据库配置文件和文件夹。实例目录存储在Windows上的不同位置,具体取决于操作系统的版本。
列出实例
以下命令用于列出实例
db2ilist
此命令列出系统上所有可用的实例。
语法
db2ilist
示例:[查看DB2副本中创建了多少个实例]
db2ilist
输出
db2inst1 db2inst2 db2inst3
实例环境命令
这些命令可用于处理DB2 CLI中实例的安排。
获取实例
此命令显示当前正在运行的实例的详细信息。
语法
db2 get instance
示例:[查看激活当前用户的当前实例]
db2 get instance
输出
The current database manager instance is : db2inst1
设置实例
要在 DB2 UDB 上启动或停止实例的数据库管理器,请针对当前实例执行以下命令。
语法
set db2instance=<instance_name>
示例:[将“db2inst1”环境安排给当前用户]
set db2instance=db2inst1
db2start
使用此命令,您可以启动实例。在此之前,您需要运行“set instance”。
语法
db2start
示例:[启动实例]
db2start
输出
SQL1063N DB2START processing was successful
db2stop
使用此命令,您可以停止正在运行的实例。
语法
db2stop
输出
SQL1064N DB2STOP processing was successful.
创建实例
让我们看看如何创建一个新实例。
db2icrt
如果要创建新实例,则需要以 root 用户身份登录。实例 ID 不是 root ID 或 root 名称。
以下是创建新实例的步骤
步骤 1:为实例创建操作系统用户。
语法
useradd -u <ID> -g <group name> -m -d <user location> <user name> -p <password>
示例:[在“db2iadm1”组中为名为“db2inst2”的实例创建用户,密码为“db2inst2”]
useradd -u 1000 -g db2iadm1 -m -d /home/db2inst2 db2inst2 -p db2inst2
步骤 2:以 root 用户身份转到 DB2 实例目录以创建新实例。
位置
cd /opt/ibm/db2/v10.1/instance
步骤 3:使用以下语法创建实例
语法
./db2icrt -s ese -u <inst id> <instance name>
示例:[在用户“db2inst2”中创建名为“db2inst2”的新实例,并具有“ESE”(企业服务器版)的功能]
./db2icrt -s ese -u db2inst2 db2inst2
输出
DBI1446I The db2icrt command is running, please wait. …. ….. DBI1070I Program db2icrt completed successfully.
安排实例的通信端口和主机
编辑 /etc/services 文件并添加端口号。在下面给出的语法中,“inst_name”表示实例名称,“inst_port”表示实例的端口号。
语法
db2c_<inst name> <inst_port>/tcp
示例:[为实例“db2inst2”添加“50001/tcp”端口号,并在“services”文件中使用变量“db2c_db2inst2”]
db2c_db2inst2 50001/tcp
语法 1:[使用服务名称更新数据库管理器配置。以下语法“svcename”表示实例服务名称,“inst_name”表示实例名称]
db2 update database manager configuration using svcename db2c_&<inst_name>
示例 1:[使用变量 svcename 的值为“db2c_db2inst2”更新实例“db2inst2”的 DBM 配置
db2 update database manager configuration using svcename db2c_db2inst2
输出
DB20000I The UPDATE DATABASE MANAGER CONFIGURATION command completed successfully.
语法 2:为当前实例设置“tcpip”通信协议。
db2set DB2COMM=tcpip
语法 3:[停止并启动当前实例以获取数据库管理器配置中的更新值]
db2stop db2start
更新实例
您可以使用以下命令更新实例
db2iupdt
此命令用于在同一版本发行版中更新实例。在执行此命令之前,您需要使用“db2stop”命令停止实例数据库管理器。以下语法中的“inst_name”表示要更新到较新版本或已安装的 DB2 服务器版本的先前发布或安装的 db2 服务器实例名称。
语法 1:以正常模式更新实例
db2iupdt <inst_name>
示例 1
./db2iupdt db2inst2
语法 2:以调试模式更新实例
db2iupdt -D <inst_name>
示例
db2iupdt -D db2inst2
升级实例
您可以将实例从 DB2 副本的先前版本升级到当前新安装的 DB2 副本版本。
db2iupgrade
在 Linux 或 UNIX 系统上,此命令位于 DB2DIR/instance 目录中。在以下语法中,“inst_name”表示先前版本的 DB2 实例,“inst_username”表示当前安装的版本 DB2 副本实例用户。
语法 2:
db2iupgrade -d -k -u <inst_username> <inst_name>
示例:
db2iupgrade -d -k -u db2inst2 db2inst2
命令参数
-d:打开调试模式。
-k:如果在您运行此命令的 DB2 副本中支持预升级实例类型,则保留该类型。
如果在 Linux 上使用超级用户 (su) 执行 db2iupgrade 命令,则必须使用“ - ”选项发出“su”命令。
删除实例
您可以删除或删除由“db2icrt”命令创建的实例。
db2idrop
在 Linux 和 UNIX 操作系统上,此命令位于 DB2_installation_folder/instance 目录中。
语法:[在以下语法中,“inst_username”表示实例的用户名,“inst_name”表示实例名称]
db2idrop -u <inst_username> <inst_name>
示例:[删除 db2inst2]
./db2idrop -u db2inst2 db2inst2
使用其他命令与实例
查找我们现在正在使用的 DB2 实例的命令。
语法 1:[检查数据库管理器激活的当前实例]
db2 get instance
输出
The current database manager instance is: db2inst1
语法 2:[查看具有操作位和发行版本的当前实例]
db2pd -inst | head -2
示例
db2pd -inst | head -2
输出
Instance db2inst1 uses 64 bits and DB2 code release SQL10010
语法 3:[检查当前工作实例的名称]
db2 select inst_name from sysibmadm.env_inst_info
示例
db2 select inst_name from sysibmadm.env_inst_info
输出
INST_NAME -------------------------------------- db2inst1 1 record(s) selected.
语法:[将新实例设置为默认实例]
db2set db2instdef=<inst_name> -g
示例:[将新创建的实例作为默认实例]
db2set db2instdef=db2inst2 -g
DB2 数据库
本章介绍如何创建、激活和停用数据库以及相关的语法。
数据库架构
数据库是表、模式、缓冲池、日志、存储组和表空间的集合,它们协同工作以有效地处理数据库操作。
数据库目录
数据库目录是数据库的有组织的存储库。创建数据库时,有关数据库的所有详细信息都存储在数据库目录中,例如默认存储设备的详细信息、配置文件和临时表列表等。
分区全局目录在实例文件夹中创建。此目录包含与数据库相关的所有全局信息。此分区全局目录命名为 NODExxxx/SQLyyy,其中 xxxx 是数据分区号,yyy 是数据库令牌。
在分区全局目录中,将创建一个成员特定目录。此目录包含本地数据库信息。成员特定目录命名为 MEMBERxxxx,其中 xxxx 是成员编号。DB2 Enterprise Server Edition 环境在一个成员上运行,并且只有一个成员特定目录。此成员特定目录的唯一名称为 MEMBER0000。
分区全局目录
目录位置:<instance>/NODExxx/SQLxxx
分区全局目录包含如下所示的数据库相关文件。
- 全局死锁写入文件事件监控文件
- 表空间信息文件 [SQLSPCS.1、SQLSPCS.2]
- 存储组控制文件 [SQLSGF.1、SQLSGF.2]
- 临时表空间容器文件。[/storage path/
/T0000011/C000000.TMP/SQL00002.MEMBER0001.TDA] - 全局配置文件 [SQLDBCONF]
- 历史文件 [DB2RHIST.ASC、DB2RHIST.BAK、DB2TSCHG.HIS、DB2TSCHG.HIS]
- 与日志相关的文件 [SQLOGCTL.GLFH.1、SQLOGCTL.GLFH.2]
- 锁定文件 [SQLINSLK、SQLTMPLK]
- 自动存储容器
成员特定目录
目录位置:/NODExxxx/SQLxxxx/MEMBER0000
此目录包含
- 与数据库关联的对象
- 缓冲池信息文件 [SQLBP.1、SQLBP.2]
- 本地事件监控文件
- 与日志相关的文件 [SQLOGCTL.LFH.1、SQLOGCTL.LFH.2、SQLOGMIR.LFH]。
- 本地配置文件
- 死锁事件监视器文件。在 ESE 和分区数据库环境中,详细的死锁事件监视器文件存储在目录节点的数据库目录中。
创建数据库
您可以使用“CREATE DATABASE”命令在实例中创建数据库。所有数据库都使用在创建实例时创建的默认存储组“IBMSTOGROUP”创建。在 DB2 中,所有数据库表都存储在“表空间”中,这些表空间使用其各自的存储组。
数据库的权限自动设置为 PUBLIC [CREATETAB、BINDADD、CONNECT、IMPLICIT_SCHEMA 和 SELECT],但是,如果存在 RESTRICTIVE 选项,则不会将权限授予 PUBLIC。
创建非限制性数据库
此命令用于创建非限制性数据库。
语法:[创建新数据库。“database_name”表示要创建的新数据库名称。]
db2 create database <database name>
示例:[创建名为“one”的新非限制性数据库]
db2 create database one
输出
DB20000I The CREATE DATABASE command completed successfully.
创建限制性数据库
调用此命令创建限制性数据库。
语法:[在以下语法中,“db_name”表示数据库名称。]
db2 create database <db_name> restrictive
示例:[创建名为“two”的新限制性数据库]
db2 create database two restrictive
使用不同的用户定义位置创建数据库
在不同的路径上使用默认存储组“IBMSTOGROUP”创建数据库。早些时候,您调用了“create database”命令,但没有任何用户定义的位置来存储或在特定位置创建数据库。要使用用户定义的数据库位置创建数据库,请遵循以下步骤
语法:[在以下语法中,“db_name”表示“数据库名称”,“data_location”表示必须在文件夹中存储数据的位置,“db_path_location”表示“data_location”的驱动器位置。]
db2 create database '<db_name>' on '<data location>' dbpath on '<db_path_location>'
示例:[创建名为“four”的数据库,其中数据存储在“data1”中,此文件夹存储在“dbpath1”中]
db2 create database four on '/data1' dbpath on '/dbpath1'
查看本地或系统数据库目录文件
您执行此命令以查看当前实例中可用的目录列表。
语法
db2 list database directory
示例
db2 list database directory
输出
System Database Directory Number of entries in the directory = 6 Database 1 entry: Database alias = FOUR Database name = FOUR Local database directory = /home/db2inst4/Desktop/dbpath Database release level = f.00 Comment = Directory entry type = Indirect Catalog database partition number = 0 Alternate server hostname = Alternate server port number = Database 2 entry: Database alias = SIX Database name = SIX Local database directory = /home/db2inst4 Database release level = f.00 Comment = Directory entry type = Indirect Catalog database partition number = 0 Alternate server hostname = Alternate server port number =
激活数据库
此命令启动特定数据库的所有必要服务,以便应用程序可以使用该数据库。
语法:[“db_name”表示数据库名称]
db2 activate db <db_name>
示例:[激活数据库“one”]
db2 activate db one
停用数据库
使用此命令,您可以停止数据库服务。
语法
db2 deactivate db <db_name>
示例:[停用数据库“one”]
db2 deactivate db one
连接到数据库
创建数据库后,要将其投入使用,您需要连接或启动数据库。
语法
db2 connect to <database name>
示例:[将数据库 one 连接到当前 CLI]
db2 connect to one
输出
Database Connection Information Database server = DB2/LINUXX8664 10.1.0 SQL authorization ID = DB2INST4 Local database alias = ONE
验证数据库是否为限制性数据库
要检查此数据库是否为限制性数据库,请使用以下语法
语法:[在以下语法中,“db”表示数据库,“cfg”表示配置,“db_name”表示数据库名称]
db2 get db cfg for <db_name> | grep -i restrict
示例:[检查数据库“one”是否为限制性数据库]
db2 get db cfg for one | grep -i restrict
输出
Restrict access = NO
配置数据库管理器和数据库
实例配置(数据库管理器配置)存储在名为“db2system”的文件中,数据库相关配置存储在名为“SQLDBCON”的文件中。这些文件无法直接编辑。您可以使用调用 API 的工具编辑这些文件。使用命令行处理器,您可以使用这些命令。
数据库管理器配置参数
语法:[获取实例数据库管理器的信息]
db2 get database manager configuration或
db2 get dbm cfg
语法:[更新实例数据库管理器]
db2 update database manager configuration或
db2 update dbm cfg
语法:[重置以前的配置]
db2 reset database manager configuration或
db2 reset dbm cfg
数据库配置参数
语法:[获取数据库的信息]
db2 get database configuration或
db2 get db cfg
语法:[更新数据库配置]
db2 update database configuration或
db2 update db cfg
语法:[重置数据库配置中先前配置的值
db2 reset database configuration或
db2 reset db cfg
语法:[检查当前活动数据库的大小]
db2 "call get_dbsize_info(?,?,?,-1)"
示例:[验证当前激活数据库的大小]
db2 "call get_dbsize_info(?,?,?,-1)"
输出
Value of output parameters -------------------------- Parameter Name : SNAPSHOTTIMESTAMP Parameter Value : 2014-07-02-10.27.15.556775 Parameter Name : DATABASESIZE Parameter Value : 105795584 Parameter Name : DATABASECAPACITY Parameter Value : 396784705536 Return Status = 0
估算数据库所需的空间
要估算数据库的大小,必须考虑以下因素的贡献
- 系统目录表
- 用户表数据
- 长字段数据
- 大型对象 (LOB) 数据
- 索引空间
- 临时工作空间
- XML 数据
- 日志文件空间
- 本地数据库目录
- 系统文件
检查数据库权限
您可以使用以下语法检查在非限制性数据库上授予 PUBLIC 的数据库权限。
步骤 1:使用实例的身份验证用户 ID 和密码连接到数据库。
语法:[使用用户名和密码连接到数据库]
db2 connect to <db_name> user <userid> using <password>
示例:[使用用户 ID“db2inst4”和密码“db2inst4”连接到数据库“one”]
db2 connect to one user db2inst4 using db2inst4
输出
Database Connection Information Database server = DB2/LINUXX8664 10.1.0 SQL authorization ID = DB2INST4 Local database alias = ONE
步骤 2:验证数据库的权限。
语法:[以下语法显示当前数据库的权限服务结果]
db2 "select substr(authority,1,25) as authority, d_user, d_group, d_public, role_user, role_group, role_public,d_role from table( sysproc.auth_list_authorities_for_authid ('public','g'))as t order by authority"
示例
db2 "select substr(authority,1,25) as authority, d_user, d_group, d_public, role_user, role_group, role_public,d_role from table( sysproc.auth_list_authorities_for_authid ('PUBLIC','G'))as t order by authority"
输出
AUTHORITY D_USER D_GROUP D_PUBLIC ROLE_USER ROLE_GROUP ROLE_PUBLIC D_ROLE ------------------------- ------ ------- -------- --------- ---------- ----------- ------ ACCESSCTRL * * N * * N * BINDADD * * Y * * N * CONNECT * * Y * * N * CREATETAB * * Y * * N * CREATE_EXTERNAL_ROUTINE * * N * * N * CREATE_NOT_FENCED_ROUTINE * * N * * N * CREATE_SECURE_OBJECT * * N * * N * DATAACCESS * * N * * N * DBADM * * N * * N * EXPLAIN * * N * * N * IMPLICIT_SCHEMA * * Y * * N * LOAD * * N * * N * QUIESCE_CONNECT * * N * * N * SECADM * * N * * N * SQLADM * * N * * N * SYSADM * * * * * * * SYSCTRL * * * * * * * SYSMAINT * * * * * * * SYSMON * * * * * * * WLMADM * * N * * N * 20 record(s) selected.
删除数据库
使用 Drop 命令,您可以从实例数据库目录中删除我们的数据库。此命令可以删除其所有对象、表、空间、容器和关联文件。
语法:[从实例中删除任何数据库]
db2 drop database <db_name>
示例: [从实例中删除名为“six”的数据库]
db2 drop database six
输出
DB20000I The DROP DATABASE command completed successfully
DB2缓冲池
本章介绍数据库中的缓冲池。
简介
缓冲池是数据库管理器分配的主内存空间的一部分。缓冲池的目的是缓存来自磁盘的表和索引数据。所有数据库都有自己的缓冲池。在创建新数据库时会创建一个默认缓冲池,称为“IBMDEFAULTBP”。根据用户需求,可以创建多个缓冲池。在缓冲池中,数据库管理器将表行数据作为页面存放。此页面将保留在缓冲池中,直到数据库关闭或该空间被新数据写入为止。缓冲池中已更新数据但尚未写入磁盘的页面称为“脏”页面。在将缓冲池中更新的数据页面写入磁盘后,缓冲池就可以接收其他数据了。
表空间和缓冲池之间的关系
每个表空间都与数据库中的特定缓冲池相关联。一个表空间与一个缓冲池相关联。缓冲池和表空间的大小必须相同。多个缓冲池允许您配置数据库使用的内存,以提高其整体性能。
缓冲池大小
使用“CREATE DATABASE”命令设置缓冲池页面大小时。如果未指定页面大小,则将采用默认页面大小,即 4KB。创建缓冲池后,以后无法修改页面大小。
列出当前数据库目录中可用的缓冲池
语法: [以下语法显示数据库中所有可用的缓冲池]
db2 select * from syscat.bufferpools
示例: [查看当前数据库中可用的缓冲池]
db2 select * from syscat.bufferpools
输出
BPNAME BUFFERPOOLID DBPGNAME NPAGES PAGESIZE ESTORE NUMBLOCKPAGES BLOCKSIZE NGNAME ------------------------------------------------------------ IBMDEFAULTBP 1 - -2 4096 N 0 0 - 1 record(s) selected.
创建缓冲池
要为数据库服务器创建新的缓冲池,需要两个参数,即“缓冲池名称”和“页面大小”。执行以下查询以创建新的缓冲池。
语法: [在以下语法中,‘bp_name’表示缓冲池名称,‘size’表示需要为缓冲池声明的页面大小 (4K、8K、16K、32K)]
db2 create bufferpool <bp_name> pagesize <size>
示例: [创建名为“bpnew”且大小为“8192”(8Kb)的新缓冲池。]
db2 create bufferpool bpnew pagesize 8192
输出
DB20000I The SQL command completed successfully.
删除缓冲池
删除缓冲池之前,需要检查是否有表空间分配给它。
语法: [删除缓冲池]
drop bufferpool <bp_name>
示例: [删除名为“bpnew”的缓冲池]
db2 drop bufferpool bpnew
输出
DB20000I The SQL command completed successfully.
DB2表空间
本章详细描述表空间。
简介
表空间是一种存储结构,它包含表、索引、大对象和长数据。它可用于将数据库中的数据组织到与数据存储在系统上的位置相关的逻辑存储组中。这些表空间存储在数据库分区组中。
表空间在数据库中的优势
表空间在数据库中以多种方式提供益处,如下所示
可恢复性: 表空间使备份和恢复操作更加方便。使用单个命令,您可以备份或恢复表空间中所有数据库对象。
自动存储管理: 数据库管理器根据需要创建和扩展容器。
内存利用率: 单个缓冲池可以管理多个表空间。您可以将临时表空间分配到其自己的缓冲池,以提高排序或联接等活动的性能。
容器
表空间包含一个或多个容器。容器可以是目录名称、设备名称或文件名。在数据库中,单个表空间可以在同一物理存储设备上拥有多个容器。如果表空间是使用自动存储表空间选项创建的,则容器的创建和管理将由数据库管理器自动处理。如果未使用自动存储表空间选项创建它,则需要自行定义和管理容器。
默认表空间
创建新数据库时,数据库管理器会为数据库创建一些默认表空间。这些表空间用作用户和临时数据的存储位置。每个数据库至少必须包含三个表空间,如下所示
- 目录表空间
- 用户表空间
- 临时表空间
目录表空间: 它包含数据库的系统目录表。它名为 SYSCATSPACE,不能删除。
用户表空间: 此表空间包含用户定义的表。在数据库中,我们有一个默认的用户表空间,名为 USERSPACE1。如果在创建表时未为表指定用户定义的表空间,则数据库管理器将为您选择默认的用户表空间。
临时表空间: 临时表空间包含临时表数据。此表空间包含系统临时表空间或用户临时表空间。
系统临时表空间保存数据库管理器在执行排序或联接等操作时所需的临时数据。数据库必须至少有一个系统临时表空间,其名称为 TEMPSPACE1。它在创建数据库时创建。用户临时表空间保存来自表的临时数据。它使用 DECLARE GLOBAL TEMPORARY TABLE 或 CREATE GLOBAL TEMPORARY TABLE 语句创建。此临时表空间不是在数据库创建时默认创建的。
表空间和存储管理
可以以不同的方式设置表空间,具体取决于您希望如何使用它们。您可以设置操作系统以管理表空间分配,您可以让数据库管理器分配空间,也可以选择为您的数据自动分配表空间。
以下三种类型的托管空间可用
系统管理空间 (SMS): 操作系统的文件系统管理器分配和管理存储表的空间。存储空间按需分配。此模型包含表示数据库对象的文件。此表空间类型在版本 10.1 中已弃用,用于用户定义的表空间,但目录和临时表空间除外。
数据库管理空间 (DMS): 数据库服务器控制存储空间。存储空间根据您在创建 DMS 表空间时指定的容器定义预先分配到文件系统上。从版本 10.1 修订包 1 开始,它已弃用,用于用户定义的表空间,但系统表空间和临时表空间除外。
自动存储表空间: 数据库服务器可以自动管理。数据库服务器根据数据库上的数据创建和扩展容器。使用自动存储管理,无需提供容器定义。数据库服务器负责创建和扩展容器,以利用分配给数据库的存储。如果将存储空间添加到存储组,则当现有容器达到其最大容量时,将自动创建新的容器。如果要立即使用新添加的存储,可以重新平衡表空间。
页面、表和表空间大小
对于临时 DMS 和自动存储表空间,您为数据库选择的页面大小决定了表空间大小的最大限制。对于表 SMS 和临时自动存储表空间,页面大小会限制表本身的大小。页面大小可以是 4kb、8kb、16kb 或 32kb。
表空间类型 | 4K 页面大小限制 | 8K 页面大小限制 | 16K 页面大小限制 | 32K 页面大小限制 |
---|---|---|---|---|
DMS、非临时自动存储表空间常规 | 64G | 128G | 256G | 512G |
DMS、临时 DMS 和非临时自动存储表空间大型 | 1892G | 16384G | 32768G | 65536G |
DB2存储组
本章介绍数据库存储组。
简介
存储数据库表或对象的一组存储路径,就是一个存储组。您可以将表空间分配到存储组。创建数据库时,所有表空间都采用默认存储组。数据库的默认存储组为“IBMSTOGROUP”。创建新数据库时,如果在“CREATE DATABASE”命令末尾传递“AUTOMATIC STOGROUP NO”参数,则默认存储组处于活动状态。数据库没有任何默认存储组。
列出存储组
您可以列出数据库中的所有存储组。
语法: [查看当前数据库中可用的存储组列表]
db2 select * from syscat.stogroups
示例: [查看当前数据库中可用的存储组列表]
db2 select * from syscat.stogroups
创建存储组
以下是在数据库中创建存储组的语法
语法: [创建新的存储组。‘stogropu_name’表示新存储组的名称,‘path’表示数据(表)存储的位置]
db2 create stogroupon ‘path’
示例: [在路径“data1”文件夹上创建一个新的存储组“stg1”]
db2 create stogroup stg1 on ‘/data1’
输出
DB20000I The SQL command completed succesfully
使用存储组创建表空间
以下是如何使用存储组创建表空间
语法: [使用现有存储组创建新的表空间]
db2 create tablespace <tablespace_name> using stogroup <stogroup_name>
示例: [使用现有存储组“stg1”创建一个名为“ts1”的新表空间]
db2 create tablespace ts1 using stogroup stg1
输出
DB20000I The SQL command completed succesfully
更改存储组
您可以使用以下语法更改存储组的位置
语法: [将存储组从旧位置移到新位置]
db2 alter stogroupadd ‘location’, ‘location’
示例: [将名为“sg1”的存储组的位置路径从旧位置修改为新位置]
db2 alter stogroup sg1 add ‘/path/data3’, ‘/path/data4’
删除存储组的文件夹路径
在删除存储组的文件夹路径之前,您可以使用 alter 命令为存储组添加新位置。
语法: [从存储组位置删除旧路径]
db2 alter stogroupdrop ‘/path’
示例: [从“stg1”删除存储组位置]
db2 alter stogroup stg1 drop ‘/path/data1’
重新平衡表空间
当我们为存储组或表空间创建新文件夹或表空间已满时,需要重新平衡表空间,同时在数据库上进行事务处理。重新平衡会使用新的存储组更新数据库配置文件。
语法: [将表空间从旧存储组路径重新平衡到新的存储组]
db2 alter tablspace <ts_name> rebalance
示例: [重新平衡]
db2 alter tablespace ts1 rebalance
重命名存储组
语法: [修改现有存储名称的名称]
db2 rename stogroup <old_stg_name> to <new_stg_name>
示例: [将存储组的名称从“sg1”修改为新名称“sgroup1”]
db2 rename stogroup sg1 to sgroup1
删除存储组
步骤 1: 在删除任何存储组之前,您可以为表空间分配一些不同的存储组。
语法: [为表空间分配另一个存储组。]
db2 alter tablspace <ts_name> using stogroup <another sto_group_name>
示例: [将表空间“ts1”从一个旧存储组更改为名为“sg2”的新存储组]
db2 alter tablespace ts1 using stogroup sg2
步骤 2
语法: [删除现有存储组]
db2 drop stogorup <stogroup_name>
示例: [从数据库中删除存储组“stg1”]
db2 drop stogroup stg1
DB2模式
本章介绍并描述模式的概念。
简介
模式是数据库中逻辑分类的命名对象的集合。
在数据库中,您不能创建多个同名的数据库对象。为此,模式提供了一个组环境。您可以在数据库中创建多个模式,并且可以使用不同的模式组创建多个同名的数据库对象。
模式可以包含表、函数、索引、表空间、过程、触发器等。例如,您为“employee”数据库创建了两个名为“Professional”和“Personal”的不同模式。可以使用相同的名称“Employee”创建两个不同的表。在这种环境中,一个表包含专业信息,另一个表包含员工的个人信息。尽管有两个同名的表,但它们有两个不同的模式“Personal”和“Professional”。因此,用户可以在不遇到任何问题的情况下使用这两个表。当对表的命名有约束时,此功能非常有用。
让我们看看一些与模式相关的命令。
获取当前活动模式
语法
db2 get schema
示例:[获取当前数据库模式]
db2 get schema
将另一个模式设置为当前环境
语法
db2 set schema=<schema_name>
示例:[将‘schema1’安排到当前实例环境]
db2 set schema=schema1
创建新模式
语法:[使用授权用户 ID 创建新模式]
db2 create schema <schema_name> authroization <inst_user>
示例:[使用‘db2inst2’授权创建“schema1”模式]
db2 create schema schema1 authorization db2inst2
练习
让我们创建两个名称相同但模式不同的表。在这里,您将使用两个不同的模式创建员工表,一个用于个人信息,另一个用于专业信息。
步骤 1:创建两个模式。
模式 1:[创建名为 professional 的模式]
db2 create schema professional authorization db2inst2
模式 2:[创建名为 personal 的模式]
db2 create schema personal authorization db2inst2
步骤 2:为员工详细信息创建两个同名的表
表 1:professional.employee
[使用模式名称‘professional’在数据库中创建一个新表‘employee’]
db2 create table professional.employee(id number, name varchar(20), profession varchar(20), join_date date, salary number);
表 2:personal.employee
[在同一数据库中使用模式名称‘personal’创建一个新表‘employee’]
db2 create table personal.employee(id number, name varchar(20), d_birth date, phone bigint, address varchar(200));
执行这些步骤后,您将获得两个名称相同(’employee’)但模式不同的表。
DB2 数据类型
本章介绍 DB2 中使用的各种数据类型。
简介
在 DB2 数据库表中,每一列都有自己的数据类型,具体取决于开发人员的要求。数据类型指的是表列中值的类型和范围。
内置数据类型
- 日期时间
- TIME:表示一天中的时间,以小时、分钟和秒表示。
- TIMESTAMP:表示日期和时间的七个值,以年、月、日、小时、分钟、秒和微秒的形式表示。
- DATE:表示一天的日期,以年、月、日三种部分表示。
- 字符串
- 字符
- CHAR(固定长度):固定长度的字符字符串。
- 可变长度
- VARCHAR:可变长度的字符字符串。
- CLOB:大型对象字符串,当字符字符串可能超过 VARCHAR 数据类型的限制时使用。
- 图形
- GRAPHIC
- 固定长度:包含双字节字符的固定长度图形字符串
- 可变长度
- VARGRAPHIC:包含双字节字符的可变字符图形字符串。
- DBCLOB:大型对象类型
- 二进制
- BLOB(可变长度):大型对象中的二进制字符串
- BOOLEAN:以 0 和 1 的形式表示。
- 有符号数值
- 精确
- 二进制整数
- SMALLINT [16BIT]:使用它可以将小整数插入列中
- INTEGER [32BIT]:使用它可以将大整数插入列中
- BIGINT [64BIT]:使用它可以将更大的整数插入列中
- 十进制
- DECIMAL(打包)
- DECFLOAT(十进制浮点数):使用它可以插入十进制浮点数
- 近似
- 浮点数
- REAL(单精度):使用此数据类型,可以插入单精度浮点数。
- DOUBLE(双精度):使用此数据类型,可以插入双精度浮点数。
- 可扩展标记语言
- XML:可以将 XML 数据存储到此数据类型列中。
DB2 表
表是由数据库管理器维护的逻辑结构。在一个表中,每个垂直块称为列(元组),每个水平块称为行(实体)。以列和行的形式存储的数据集合称为表。在表中,每一列都有不同的数据类型。表用于存储持久数据。
表的类型
- 基本表:它们保存持久数据。基本表有不同种类,包括
- 常规表:通用表,带索引的普通表是通用表。
- 多维聚簇表 (MDC):此类表在多个键上进行物理聚簇,用于维护大型数据库环境。这些类型的表在 DB2 pureScale 中不受支持。
- 插入时间聚簇表 (ITC):类似于 MDC 表,行按插入表中的时间进行聚簇。它们可以是分区表。它们也不支持 pureScale 环境。
- 范围聚簇表 (RCT):这些类型的表提供对数据的快速直接访问。这些表作为顺序聚簇实现。表中的每个记录都有一个记录 ID。这些类型的表用于数据与表中的一列或多列紧密聚簇的情况。此类表也不支持 DB2 pureScale。
- 分区表:这些类型的表用于数据组织模式,其中表数据被分成多个存储对象。可以向分区表添加、附加和分离数据分区。您可以将来自一个表的多个数据分区存储在一个表空间中。
- 时间表:数据库中表的历史记录存储在时间表中,例如先前执行的修改的详细信息。
- 临时表:对于不同数据库操作的临时工作,需要使用临时表。临时表 (DGTTs) 不出现在系统目录中,XML 列不能用于创建的临时表。
- 物化查询表:MQT 可用于提高查询性能。这些类型的表由一个查询定义,该查询用于确定表中的数据。
创建表
以下语法创建表
语法:[创建新表]
db2 create table <schema_name>.<table_name> (column_name column_type....) in <tablespace_name>
示例:我们创建一个表来存储“employee”详细信息在“professional”模式中。此表具有“id、name、jobrole、joindate、salary”字段,并且此表数据将存储在表空间“ts1”中。
db2 create table professional.employee(id int, name varchar(50),jobrole varchar(30),joindate date, salary double) in ts1
输出
DB20000I The SQL command completed successfully.
列出表详细信息
以下语法用于列出表详细信息
语法:[查看已创建的带模式的表的列表]
db2 select tabname, tabschema, tbspace from syscat.tables
示例:[查看当前数据库中的表列表]
db2 select tabname, tabschema, tbspace from syscat.tables
输出
TABNAME TABSCHEMA TBSPACE ------------ ------------- -------- EMPLOYEE PROFESSIONAL TS1 1 record(s) selected.
列出表中的列
以下语法列出表中的列
语法:[查看表的列和数据类型]
db2 describe table <table_name>
示例:[查看表‘employee’的列和数据类型]
db2 describe table professional.employee
输出
Data type Column Column name schema Data type name Length Scale Nulls ------ ----- --------- ----------------- --------- ----- ------ ID SYSIBM INTEGER 4 0 Yes NAME SYSIBM VARCHAR 50 0 Yes JOBROLE SYSIBM VARCHAR 30 0 Yes JOINDATE SYSIBM DATE 4 0 Yes SALARY SYSIBM DOUBLE 8 0 Yes 5 record(s) selected.
隐藏列
您可以隐藏表的整列。如果您调用“select * from”查询,则隐藏的列不会在结果表中返回。当您将数据插入表时,“INSERT”语句(不带列列表)不会期望任何隐式隐藏列的值。这些类型的列在物化查询表中被高度引用。这些类型的列不支持创建临时表。
创建带隐藏列的表
以下语法创建带隐藏列的表
语法:[创建带隐藏列的表]
db2 create table <tab_name> (col1 datatype,col2 datatype implicitly hidden)
示例:[创建具有隐藏列‘phone’的‘customer’表]
db2 create table professional.customer(custid integer not null, fullname varchar(100), phone char(10) implicitly hidden)
在表中插入数据值
以下语法在表中插入值
语法:[将值插入表中]
db2 insert into <tab_name>(col1,col2,...) values(val1,val2,..)
示例:[在‘customer’表中插入值]
db2 insert into professional.customer(custid, fullname, phone) values(100,'ravi','9898989') db2 insert into professional.customer(custid, fullname, phone) values(101,'krathi','87996659') db2 insert into professional.customer(custid, fullname, phone) values(102,'gopal','768678687')
输出
DB20000I The SQL command completed successfully.
从表中检索值
以下语法从表中检索值
语法:[从表中检索值]
db2 select * from <tab_name>
示例:[从‘customer’表中检索值]
db2 select * from professional.customer
输出
CUSTID FULLNAME ----------- ------------------------ 100 ravi 101 krathi 102 gopal 3 record(s) selected.
从表中检索值,包括隐藏列
以下语法从选定的列中检索值
语法:[从表中检索选定的隐藏列值]
db2 select col1,col2,col3 from <tab_name>
示例:[从表中检索选定列值的结果]
db2 select custid,fullname,phone from professional.customer
输出
CUSTID FULLNAME PHONE ------- --------- ------------ 100 ravi 9898989 101 krathi 87996659 102 gopal 768678687 3 record(s) selected.
如果要查看隐藏列中的数据,需要执行“DESCRIBE”命令。
语法:
db2 describe table <table_name> show detail
示例
db2 describe table professional.customer show detail
输出
Column name Data type schema Data type name Column column Partitionkey code Length Scale Nulls number sequence page Hidden Default --------------- -------------------- --------------- -------- ---- ---- -------- ---------- ------------- -------- ----------- ------ --- CUSTID SYSIBM INTEGER 4 0 No 0 0 0 No FULLNAME SYSIBM VARCHAR 100 0 Yes 1 0 1208 No PHONE SYSIBM CHARACTER 10 0 Yes 2 0 1208 Implicitly 3 record(s) selected.
更改表列的类型
您可以使用以下“alter”命令修改表结构
语法:
db2 alter table <tab_name> alter column <col_name> set data type <data_type>
示例:[将表 employee 中列“id”的数据类型从“int”修改为“bigint”]
db2 alter table professional.employee alter column id set data type bigint
输出:
DB20000I The SQL command completed successfully.
更改列名
您可以更改列名,如下所示
语法:[将表的列名从旧名称修改为新名称]
db2 alter table <tab_name> rename column <old_name> to <new_name>
示例:[将“customers”表中的列名从“fullname”修改为“custname”。]
db2 alter table professional.customer rename column fullname to custname
删除表
要删除任何表,需要使用以下“DROP”命令
语法:
db2 drop table <tab_name>
示例:[从数据库中删除 customer 表]
db2 drop table professional.customers
要删除表的整个层次结构(包括触发器和关系),需要使用“DROP TABLE HIERARCHY”命令。
语法:
db2 drop table hierarchy <tab_name>
示例:[删除表‘customer’的整个层次结构]
db2 drop table hierarchy professional.customers
DB2 别名
本章介绍如何创建别名以及如何使用数据库对象的别名检索数据。
简介
别名是数据库对象的替代名称。它可以用来引用数据库对象。可以说,它是数据库对象的昵称。为对象定义别名是为了缩短其名称,从而减少查询大小并提高查询的可读性。
创建数据库对象别名
您可以创建数据库对象别名,如下所示
语法:
db2 create alias <alias_name> for <table_name>
示例:为表“professional.customer”表创建别名
db2 create alias pro_cust for professional.customer
如果您传递“SELECT * FROM PRO_CUST”或“SELECT * FROM PROFESSIONAL.CUSTOMER”,数据库服务器将显示相同的结果。
语法:[直接使用模式名称从表中检索值]
db2 select * from <schema_name>.<table_name>
示例:[从 customer 表中检索值]
db2 select * from professional.customer
输出
CUSTID FULLNAME PHONE ------- --------- ------------ 100 ravi 9898989 101 krathi 87996659 102 gopal 768678687 3 record(s) selected.
使用表的别名检索值
您可以使用别名从数据库中检索值,如下所示
语法:[通过调用表的别名从表中检索值]
db2 select * from <alias_name>
示例:[使用别名从 customer 表中检索值]
db2 select * from pro_cust
输出
CUSTID FULLNAME PHONE ------- --------- ------------ 100 ravi 9898989 101 krathi 87996659 102 gopal 768678687 3 record(s) selected.
DB2 约束
本章介绍数据库中的各种约束。
简介
为了强制数据库完整性,定义了一组规则,称为约束。约束要么允许要么禁止列中的值。
在实时数据库活动中,数据应在某些限制下添加。例如,在销售数据库中,销售 ID 或交易 ID 应该唯一。约束类型有
- NOT NULL
- 唯一
- 主键
- 外键
- 检查
- 信息性
约束仅与表相关联。它们仅应用于特定表。它们在表创建时定义并应用于表。
每个约束的说明
NOT NULL
这是一条规则,用于禁止表中一个或多个列中的空值。
语法
db2 create table <table_name>(col_name col_type not null,..)
示例:[创建销售表,其中包含四列(id、itemname、qty、price),在此向所有列添加“not null”约束,以避免在表中形成任何空单元格。]
db2 create table shopper.sales(id bigint not null, itemname varchar(40) not null, qty int not null,price double not null)
在表中插入 NOT NULL 值
您可以在表中插入值,如下所示
示例:[错误查询]
db2 insert into shopper.sales(id,itemname,qty) values(1,'raagi',12)
输出:[正确查询]
DB21034E The command was processed as an SQL statement because it was not a valid Command Line Processor command. During SQL processing it returned: SQL0407N Assignment of a NULL value to a NOT NULL column "TBSPACEID=5, TABLEID=4, COLNO=3" is not allowed. SQLSTATE=23502
示例:[正确查询]
db2 insert into shopper.sales(id,itemname,qty,price) values(1,'raagi',12, 120.00) db2 insert into shopper.sales(id,itemname,qty,price) values(1,'raagi',12, 120.00)
输出
DB20000I The SQL command completed successfully.
唯一约束
使用这些约束,您可以唯一地设置列的值。为此,在创建表时,唯一约束与“not null”约束一起声明。
语法
db2 create table <tab_name>(<col> <col_type> not null unique, ...)
示例
db2 create table shopper.sales1(id bigint not null unique, itemname varchar(40) not null, qty int not null,price double not null)
将值插入表中
示例:插入四行不同的行,其唯一 ID 为 1、2、3 和 4。
db2 insert into shopper.sales1(id, itemname, qty, price) values(1, 'sweet', 100, 89) db2 insert into shopper.sales1(id, itemname, qty, price) values(2, 'choco', 50, 60) db2 insert into shopper.sales1(id, itemname, qty, price) values(3, 'butter', 30, 40) db2 insert into shopper.sales1(id, itemname, qty, price) values(4, 'milk', 1000, 12)
示例:插入一个新的行,其“id”值为 3
db2 insert into shopper.sales1(id, itemname, qty, price) values(3, 'cheese', 60, 80)
输出:当您尝试使用已存在的 id 值插入新行时,它将显示此结果
DB21034E The command was processed as an SQL statement because it was not a valid Command Line Processor command. During SQL processing it returned: SQL0803N One or more values in the INSERT statement, UPDATE statement, or foreign key update caused by a DELETE statement are not valid because the primary key, unique constraint or unique index identified by "1" constrains table "SHOPPER.SALES1" from having duplicate values for the index key. SQLSTATE=23505
主键
类似于唯一约束,您可以使用“主键”和“外键”约束来声明多个表之间的关系。
语法
db2 create table <tab_name>(,.., primary key ())
示例:创建名为“salesboys”的表,并将“sid”作为主键
db2 create table shopper.salesboys(sid int not null, name varchar(40) not null, salary double not null, constraint pk_boy_id primary key (sid))
外键
外键是表中的一组列,这些列需要与另一个表中某一行的至少一个主键匹配。它是一种参照约束或参照完整性约束。它是一个关于一个或多个表中多列值的逻辑规则。它使表之间建立必要的关系。
之前,您创建了一个名为“shopper.salesboys”的表。对于此表,“sid”是主键。现在您正在创建一个新的表,该表包含销售员的个人详细信息,具有不同的模式,名为“employee”和表名为“salesboys”。在这种情况下,“sid”是外键。
语法
db2 create table <tab_name>(<col> <col_type>,constraint <const_name> foreign key (<col_name>) reference <ref_table> (<ref_col>)
示例:[创建名为“salesboys”的表,其中包含外键列“sid”]
db2 create table employee.salesboys( sid int, name varchar(30) not null, phone int not null, constraint fk_boy_id foreign key (sid) references shopper.salesboys (sid) on delete restrict )
示例:[将值插入主键表“shopper.salesboys”]
db2 insert into shopper.salesboys values(100,'raju',20000.00), (101,'kiran',15000.00), (102,'radha',10000.00), (103,'wali',20000.00), (104,'rayan',15000.00)
示例:[将值插入外键表“employee.salesboys”[无错误]]
db2 insert into employee.salesboys values(100,'raju',98998976), (101,'kiran',98911176), (102,'radha',943245176), (103,'wali',89857330), (104,'rayan',89851130)
如果您输入了一个未知数字,该数字未存储在“shopper.salesboys”表中,它将显示 SQL 错误。
示例:[错误执行]
db2 insert into employee.salesboys values(105,'rayan',89851130)
输出
DB21034E The command was processed as an SQL statement because it was not a valid Command Line Processor command. During SQL processing it returned: SQL0530N The insert or update value of the FOREIGN KEY "EMPLOYEE.SALESBOYS.FK_BOY_ID" is not equal to any value of the parent key of the parent table. SQLSTATE=23503
检查约束
您需要使用此约束为表中的特定列添加条件限制。
语法
db2 create table( primary key ( ), constraint check (condition or condition) )
示例:[创建具有约束值的emp1表]
db2 create table empl (id smallint not null, name varchar(9), dept smallint check (dept between 10 and 100), job char(5) check (job in ('sales', 'mgr', 'clerk')), hiredate date, salary decimal(7,2), comm decimal(7,2), primary key (id), constraint yearsal check (year(hiredate) > 1986 or salary > 40500) )
插入值
您可以如下所示将值插入表中
db2 insert into empl values (1,'lee', 15, 'mgr', '1985-01-01' , 40000.00, 1000.00)
删除约束
让我们看看删除各种约束的语法。
删除唯一约束
语法
db2 alter table <tab_name> drop unique <const_name>
删除主键
语法
db2 alter table <tab_name> drop primary key
删除检查约束
语法
db2 alter table <tab_name> drop check <check_const_name>
删除外键
语法
db2 alter table <tab_name> drop foreigh key <foreign_key_name>
DB2 索引
本章介绍索引、索引类型、创建和删除索引。
简介
索引是一组指针,可以引用表中的行、MDC 或 ITC 表中的块、XML 存储对象中的 XML 数据,这些数据按一个或多个键的值进行逻辑排序。它是在 DB2 表列上创建的,以加快查询的数据访问速度,并有效地对数据进行聚类和分区。它还可以提高视图上操作的性能。具有唯一索引的表可以具有具有唯一键的行。根据表的需要,您可以采用不同类型的索引。
索引类型
- 唯一索引和非唯一索引
- 聚集索引和非聚集索引
创建索引
要创建唯一索引,请使用以下语法
语法
db2 create unique index <index_name> on <table_name>(<unique_column>) include (<column_names..>)
示例:为“shopper.sales1”表创建索引。
db2 create unique index sales1_indx on shopper.sales1(id) include (itemname)
删除索引
要删除索引,请使用以下语法
语法
db2 create unique index <index_name> on <table_name>(<unique_column>) include (<column_names..>)
示例
db2 drop index sales_index
DB2 触发器
本章介绍触发器、触发器类型、触发器的创建和删除。
简介
触发器是一组操作,这些操作是为了响应数据库中指定表上的 INSERT、UPDATE 或 DELETE 操作而执行的。触发器一次存储在数据库中。它们处理数据的治理。它们可以在多个应用程序之间访问和共享。使用触发器的优点是,如果应用程序需要进行任何更改,则在触发器处进行;而不是更改每个访问触发器的应用程序。触发器易于维护,并且它们可以加快应用程序开发速度。触发器使用 SQL 语句“CREATE TRIGGER”定义。
触发器类型
触发器有两种类型
1. BEFORE 触发器
它们在任何 SQL 操作之前执行。
2. AFTER 触发器
它们在任何 SQL 操作之后执行。
创建 BEFORE 触发器
让我们看看如何创建一系列触发器
语法
db2 create sequence <seq_name>
示例:为表 shopper.sales1 创建一系列触发器
db2 create sequence sales1_seq as int start with 1 increment by 1
语法
db2 create trigger <trigger_name> no cascade before insert on <table_name> referencing new as <table_object> for each row set <table_object>.<col_name>=nextval for <sequence_name>
示例:为 shopper.sales1 表创建触发器,以自动插入主键编号
db2 create trigger sales1_trigger no cascade before insert on shopper.sales1 referencing new as obj for each row set obj.id=nextval for sales1_seq
现在尝试插入任何值
db2 insert into shopper.sales1(itemname, qty, price) values('bicks', 100, 24.00)
从表中检索值
让我们看看如何从表中检索值
语法
db2 select * from <tablename>
示例:
db2 select * from shopper.sales1
输出:
ID ITEMNAME QTY ------- ------------ ---------- 3 bicks 100 2 bread 100 2 record(s) selected.
创建 AFTER 触发器
让我们看看如何创建 AFTER 触发器
语法
db2 create trigger <trigger_name> no cascade before insert on <table_name> referencing new as <table_object> for each row set <table_object>.<col_name>=nextval for <sequence_name>
示例:[插入和检索值]
db2 create trigger sales1_tri_after after insert on shopper.sales1 for each row mode db2sql begin atomic update shopper.sales1 set price=qty*price; end
输出
//inseting values in shopper.sales1 db2 insert into shopper.sales1(itemname,qty,price) values('chiken',100,124.00) //output ID ITEMNAME QTY PRICE ----- -------------- ----------- ----------- 3 bicks 100 2400.00 4 chiken 100 12400.00 2 bread 100 2400.00 3 record(s) selected.
删除触发器
以下是数据库触发器的删除方式
语法
db2 drop trigger <trigger_name>
示例
db2 drop trigger slaes1_trigger
DB2 - 序列
本章向您介绍序列的概念、序列的创建、序列的查看以及序列的删除。
简介
序列是一个软件函数,它以升序或降序生成整数,在一定范围内,用于生成主键并在表之间协调其他键。您可以使用序列来获取整数,例如 employee_id 或 transaction_id。序列可以支持 SMALLINT、BIGINT、INTEGER 和 DECIMAL 数据类型。序列可以在多个应用程序之间共享。序列的增量或减量与事务无关。
序列由 CREATE SEQUENCE 语句创建。
序列类型
有两种类型的序列可用
NEXTVAL:它返回序列号的增量值。
PREVIOUS VALUE:它返回最近生成的值。
序列参数
序列使用以下参数
数据类型:这是返回的增量值的数据类型。(SMALLINT、BIGINT、INTEGER、NUMBER、DOUBLE)
START WITH:序列开始的参考值。
MINVALUE:序列开始的最小值。
MAXVALUE:序列的最大值。
INCREMENT BY:序列增量的步长值。
序列循环:CYCLE 子句导致序列重复生成。序列生成是通过引用由先前序列生成存储到数据库中的返回值来进行的。
创建序列
您可以使用以下语法创建序列
语法
db2 create sequence <seq_name>
示例:[创建名为“sales1_seq”的新序列,并从 1 开始递增值]
db2 create sequence sales1_seq as int start with 1 increment by 1
查看序列
您可以使用以下语法查看序列
语法
db2 value <previous/next> value for <seq_name>
示例:[查看序列“sales1_seq”中先前更新值的列表]
db2 values previous value for sales1_seq
输出
1 ----------- 4 1 record(s) selected.
删除序列
要删除序列,您需要使用“DROP SEQUENCE”
语法
db2 drop sequence <seq_name>>
示例:[从数据库中删除序列“sales1_seq”]
db2 drop sequence sales1_seq
输出
DB20000I The SQL command completed successfully.
DB2 视图
本章介绍视图、创建、修改和删除视图。
简介
视图是表示存储在表中的数据的另一种方式。它不是实际的表,也没有任何永久存储。视图提供了一种查看一个或多个表中的数据的方式。它是结果表的命名规范。
创建视图
您可以使用以下语法创建视图
语法
db2 create view <view_name> (<col_name>, <col_name1...) as select <cols>.. from <table_name>
示例:为 shopper.sales1 表创建视图
db2 create view view_sales1(id, itemname, qty, price) as select id, itemname, qty, price from shopper.sales1
修改视图
您可以使用以下语法修改视图
语法
db2 alter view <view_name> alter <col_name> add scope <table_or_view_name>
示例:[向现有视图“view_sales1”添加新表列]
db2 alter view view_sales1 alter id add scope shopper.sales1
删除视图
您可以使用以下语法删除视图
语法
db2 drop view <view_name>
示例
db2 drop view sales1_view
DB2与XML
本章介绍了 XML 与 DB2 的使用。
简介
PureXML 功能允许您将格式良好的 XML 文档存储在数据库表中的列中。这些列具有 XML 数据库。通过将 XML 数据存储在 XML 列中,数据以其本机分层形式保留。存储的 XML 数据可以通过 DB2 数据库服务器功能进行访问和管理。以其本机分层形式存储 XML 数据可以有效地搜索、检索和更新 XML。要更新 XML 数据中的值,您需要使用 XQuery、SQL 或两者的组合。
创建用于存储 XML 数据的数据库和表
通过发出以下语法创建数据库
语法
db2 create database xmldb
默认情况下,数据库使用 UTF-8(UNICODE)代码集。激活数据库并连接到它
语法
db2 activate db <db_name> db2 connect to <db_name>
示例
db2 activate db xmldb db2 connect to xmldb
创建一个格式良好的 XML 文件,并创建一个表,其列的数据类型为“XML”。必须在双引号内传递包含 XML 语法的 SQL 查询。
语法
db2 “create table <schema>.<table>(col <datatype>, col <xml datatype>)”
示例
db2 "create table shope.books(id bigint not null primary key, book XML)"
将 xml 值插入表中,格式良好的 XML 文档使用 SQL 语句“INSERT”插入 XML 类型列中。
语法
db2 “insert into <table_name> values(value1, value2)”
示例
db2 "insert into shope.books values(1000, '<catalog> <book> <author> Gambardella Matthew</author> <title>XML Developers Guide</title> <genre>Computer</genre> <price>44.95</price> <publish_date>2000-10-01</publish_date> <description>An in-depth look at creating application with XML</description> </book> </catalog>')"
更新表中的 XML 数据
您可以使用以下语法更新表中的 XML 数据
语法
db2 “update <table_name> set <column>=<value> where <column>=<value>”
示例
db2 "update shope.books set book='<catalog> <book> <author> Gambardella, Matthew</author> <title>XML Developers Guide</title> <genre>Computer</genre> <price>44.95</price> <publish_date>2000-10-01</publish_date> <description>An in-depth XML</description> </book> </catalog>' where id=1000"
DB2 - 备份和恢复
本章介绍数据库的备份和恢复方法。
简介
备份和恢复方法旨在确保我们信息的安全。在命令行界面 (CLI) 或图形用户界面 (GUI) 中使用备份和恢复实用程序,您可以在 DB2 UDB 中备份或恢复数据库的数据。
日志记录
日志文件包含错误日志,用于从应用程序错误中恢复。日志记录数据库更改的记录。日志记录有两种类型,如下所述
循环日志记录
这是一种方法,当需要分配新的事务日志文件时,旧的事务日志会被覆盖,从而擦除日志文件的序列并重复使用它们。您只能在脱机模式下进行完全备份。即,数据库必须脱机才能进行完全备份。
归档日志记录
此模式支持使用称为正向恢复的日志文件进行联机备份和数据库恢复。可以通过将 logretain 或 userexit 设置为 ON 来更改备份模式,从循环模式更改为归档模式。对于归档日志记录,备份设置数据库需要一个 DB2 进程可写入的目录。
备份
使用Backup命令,您可以获取整个数据库的副本。此备份副本包括数据库系统文件、数据文件、日志文件、控制信息等。
您可以在脱机和联机工作时进行备份。
脱机备份
语法:[列出活动应用程序/数据库]
db2 list application
输出
Auth Id Application Appl. Application Id DB # of Name Handle Name Agents -------- -------------- ---------- --------------------- ----------------------------------------- -------- ----- DB2INST1 db2bp 39 *LOCAL.db2inst1.140722043938 ONE 1
语法:[强制使用 app. Handled id 的应用程序]
db2 "force application (39)"
输出
DB20000I The FORCE APPLICATION command completed successfully. DB21024I This command is asynchronous and may not be effective immediately.
语法:[终止数据库连接]
db2 terminate
语法:[停用数据库]
db2 deactivate database one
语法:[获取备份文件]
db2 backup database <db_name> to <location>
示例
db2 backup database one to /home/db2inst1/
输出
Backup successful. The timestamp for this backup image is : 20140722105345
联机备份
要启动,您需要将模式从循环日志记录更改为归档日志记录。
语法:[检查数据库是否使用循环或归档日志记录]
db2 get db cfg for one | grep LOGARCH
输出
First log archive method (LOGARCHMETH1) = OFF Archive compression for logarchmeth1 (LOGARCHCOMPR1) = OFF Options for logarchmeth1 (LOGARCHOPT1) = Second log archive method (LOGARCHMETH2) = OFF Archive compression for logarchmeth2 (LOGARCHCOMPR2) = OFF Options for logarchmeth2 (LOGARCHOPT2) =
在以上输出中,突出显示的值是关闭模式下的 [logarchmeth1 和 logarchmeth2],这意味着当前数据库处于“循环日志记录”模式。如果您需要使用“归档日志记录”模式,则需要在配置文件中存在的变量 logarchmeth1 和 logarchmeth2 中更改或添加路径。
使用所需的归档目录更新 logarchmeth1
语法:[创建目录]
mkdir backup mkdir backup/ArchiveDest
语法:[为文件夹提供用户权限]
chown db2inst1:db2iadm1 backup/ArchiveDest
语法:[更新配置 LOGARCHMETH1]
db2 update database configuration for one using LOGARCHMETH1 'DISK:/home/db2inst1/backup/ArchiveDest'
您可以进行脱机备份以确保安全,激活数据库并连接到它。
语法:[进行联机备份]
db2 backup database one online to /home/db2inst1/onlinebackup/ compress include logs
输出
db2 backup database one online to /home/db2inst1/onlinebackup/ compress include logs
使用以下命令验证备份文件
语法
db2ckbkp <location/backup file>
示例
db2ckbkp /home/db2inst1/ONE.0.db2inst1.DBPART000.20140722112743.001
列出备份文件历史记录
语法
db2 list history backup all for one
输出
List History File for one Number of matching file entries = 4 Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log Backup ID -- --- ------------------ ---- --- ------------ ------------ -------------- B D 20140722105345001 F D S0000000.LOG S0000000.LOG ------------------------------------------------------------ ---------------- Contains 4 tablespace(s): 00001 SYSCATSPACE 00002 USERSPACE1 00003 SYSTOOLSPACE 00004 TS1 ------------------------------------------------------------ ---------------- Comment: DB2 BACKUP ONE OFFLINE Start Time: 20140722105345 End Time: 20140722105347 Status: A ------------------------------------------------------------ ---------------- EID: 3 Location: /home/db2inst1 Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log Backup ID -- --- ------------------ ---- --- ------------ ------------ -------------- B D 20140722112239000 N S0000000.LOG S0000000.LOG ------------------------------------------------------------ ------------------------------------------------------------- ------------------------------- Comment: DB2 BACKUP ONE ONLINE Start Time: 20140722112239 End Time: 20140722112240 Status: A ------------------------------------------------------------ ---------------- EID: 4 Location: SQLCA Information sqlcaid : SQLCA sqlcabc: 136 sqlcode: -2413 sqlerrml: 0 sqlerrmc: sqlerrp : sqlubIni sqlerrd : (1) 0 (2) 0 (3) 0 (4) 0 (5) 0 (6) 0 sqlwarn : (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) sqlstate: Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log Backup ID -- --- ------------------ ---- --- ------------ ------------ -------------- B D 20140722112743001 F D S0000000.LOG S0000000.LOG ------------------------------------------------------------ ---------------- Contains 4 tablespace(s): 00001 SYSCATSPACE 00002 USERSPACE1 00003 SYSTOOLSPACE 00004 TS1 ------------------------------------------------------------- ---------------- Comment: DB2 BACKUP ONE OFFLINE Start Time: 20140722112743 End Time: 20140722112743 Status: A ------------------------------------------------------------- ---------------- EID: 5 Location: /home/db2inst1 Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log Backup ID ------------------------------------------------------------- ---------------- R D 20140722114519001 F 20140722112743 ------------------------------------------------------------ ---------------- Contains 4 tablespace(s): 00001 SYSCATSPACE 00002 USERSPACE1 00003 SYSTOOLSPACE 00004 TS1 ------------------------------------------------------------ ---------------- Comment: RESTORE ONE WITH RF Start Time: 20140722114519 End Time: 20140722115015 Status: A ------------------------------------------------------------ ---------------- EID: 6 Location:
从备份恢复数据库
要从备份文件恢复数据库,您需要遵循给定的语法
语法
db2 restore database <db_name> from <location> taken at <timestamp>
示例
db2 restore database one from /home/db2inst1/ taken at 20140722112743
输出
SQL2523W Warning! Restoring to an existing database that is different from the database on the backup image, but have matching names. The target database will be overwritten by the backup version. The Roll-forward recovery logs associated with the target database will be deleted. Do you want to continue ? (y/n) y DB20000I The RESTORE DATABASE command completed successfully.
将位于日志目录中的所有日志正向滚动,包括磁盘驱动器故障之前的最新更改。
语法
db2 rollforward db <db_name> to end of logs and stop
示例
db2 rollforward db one to end of logs and stop
输出
Rollforward Status Input database alias = one Number of members have returned status = 1 Member ID = 0 Rollforward status = not pending Next log file to be read = Log files processed = S0000000.LOG - S0000001.LOG Last committed transaction = 2014-07-22- 06.00.33.000000 UTC DB20000I The ROLLFORWARD command completed successfully.
DB2 - 数据库安全
本章介绍数据库安全。
简介
DB2 数据库和功能可以通过两种不同的安全控制模式进行管理
- 身份验证
- 授权
身份验证
身份验证是确认用户登录仅符合其被授权执行的活动的权限的过程。用户身份验证可以在操作系统级别或数据库级别本身执行。通过使用生物识别身份验证工具(例如视网膜和指纹)来防止黑客或恶意用户访问数据库。
数据库安全性可以从 db2 数据库系统外部进行管理。以下是一些安全身份验证流程的类型
- 基于操作系统身份验证。
- 轻量级目录访问协议 (LDAP)
对于 DB2,安全服务作为单独的产品是操作系统的一部分。对于身份验证,它需要两个不同的凭据,即用户 ID 或用户名和密码。
授权
您可以访问 DB2 数据库系统内的 DB2 数据库及其功能,该系统由 DB2 数据库管理器管理。授权是由 DB2 数据库管理器管理的过程。管理器获取有关当前已认证用户的的信息,该信息指示用户可以执行或访问哪些数据库操作。
以下是授权可用的不同权限方式
主要权限:直接授予授权 ID。
辅助权限:如果用户是成员,则授予组和角色。
公共权限:公开授予所有用户。
上下文相关权限:授予受信任的上下文角色。
可以根据以下类别向用户授予授权
- 系统级授权
- 系统管理员 [SYSADM]
- 系统控制 [SYSCTRL]
- 系统维护 [SYSMAINT]
- 系统监控 [SYSMON]
权限提供对实例级功能的控制。权限提供给组权限,以控制维护和授权操作。例如,数据库和数据库对象。
- 数据库级授权
- 安全管理员 [SECADM]
- 数据库管理员 [DBADM]
- 访问控制 [ACCESSCTRL]
- 数据访问 [DATAACCESS]
- SQL 管理员。[SQLADM]
- 工作负载管理管理员 [WLMADM]
- 解释 [EXPLAIN]
权限提供数据库内的控制。数据库的其他权限包括 LDAD 和 CONNECT。
- 对象级授权:对象级授权涉及在对对象执行操作时验证权限。
- 基于内容的授权:用户可以使用基于标签的访问控制 [LBAC] 对特定表上的各个行和列拥有读写访问权限。
DB2 表和配置文件用于记录与授权名称关联的权限。当用户尝试访问数据时,记录的权限会验证以下权限
- 用户的授权名称
- 用户属于哪个组
- 直接或间接授予用户或组的哪些角色
- 通过受信任的上下文获得的权限。
在使用 SQL 语句时,DB2 授权模型会考虑以下权限的组合
- 授予与 SQL 语句关联的主要授权 ID 的权限。
- 与 SQL 语句关联的辅助授权 ID。
- 授予 PUBLIC
- 授予受信任的上下文角色。
实例级权限
让我们讨论一些与实例相关的权限。
系统管理权限 (SYSADM)
它是实例级最高级别的管理权限。拥有 SYSADM 权限的用户可以在实例内执行某些数据库和数据库管理器命令。拥有 SYSADM 权限的用户可以执行以下操作
- 升级数据库
- 恢复数据库
- 更新数据库管理器配置文件。
系统控制权限 (SYSCTRL)
它是系统控制权限中的最高级别。它提供对数据库管理器实例及其数据库执行维护和实用程序操作的权限。这些操作可能会影响系统资源,但它们不允许直接访问数据库中的数据。
拥有 SYSCTRL 权限的用户可以执行以下操作
- 更新数据库、节点或分布式连接服务 (DCS) 目录
- 强制用户退出系统级
- 创建或删除数据库级
- 创建、更改或删除表空间
- 使用任何表空间
- 恢复数据库
系统维护权限 (SYSMAINT)
它是系统控制权限的第二级。它提供对数据库管理器实例及其数据库执行维护和实用程序操作的权限。这些操作会影响系统资源,但不会允许直接访问数据库中的数据。此权限专为用户维护包含敏感数据的数据库管理器实例中的数据库而设计。
只有拥有 SYSMAINT 或更高级别系统权限的用户才能执行以下任务
- 备份
- 恢复备份
- 前滚恢复
- 启动或停止实例
- 恢复表空间
- 执行 db2trc 命令
- 在实例级用户或数据库级用户的情况下拍摄系统监控快照。
拥有 SYSMAINT 权限的用户可以执行以下任务
- 查询表空间的状态
- 更新日志历史文件
- 表的重组
- 使用 RUNSTATS(收集目录统计信息)
系统监控权限 (SYSMON)
使用此权限,用户可以监控或拍摄数据库管理器实例或其数据库的快照。SYSMON 权限使用户能够运行以下任务
- GET DATABASE MANAGER MONITOR SWITCHES
- GET MONITOR SWITCHES
- GET SNAPSHOT
- LIST
- LIST ACTIVE DATABASES
- LIST APPLICATIONS
- LIST DATABASE PARTITION GROUPS
- LIST DCS APPLICATIONS
- LIST PACKAGES
- LIST TABLES
- LIST TABLESPACE CONTAINERS
- LIST TABLESPACES
- LIST UTITLITIES
- RESET MONITOR
- UPDATE MONITOR SWITCHES
数据库权限
每个数据库权限都持有授权 ID 以对数据库执行某些操作。这些数据库权限与权限不同。以下是某些数据库权限的列表
ACCESSCTRL:允许授予和撤销所有对象权限和数据库权限。
BINDADD:允许在数据库中创建新的包。
CONNECT:允许连接到数据库。
CREATETAB:允许在数据库中创建新表。
CREATE_EXTERNAL_ROUTINE:允许创建应用程序和数据库用户可使用的过程。
DATAACCESS:允许访问存储在数据库表中的数据。
DBADM:充当数据库管理员。它授予除 ACCESSCTRL、DATAACCESS 和 SECADM 之外的所有其他数据库权限。
EXPLAIN:允许解释查询计划,而无需他们持有访问表中数据的权限。
IMPLICIT_SCHEMA:允许用户通过使用 CREATE 语句创建对象来隐式创建模式。
LOAD:允许将数据加载到表中。
QUIESCE_CONNECT:允许在数据库处于静止状态(临时禁用)时访问数据库。
SECADM:允许充当数据库的安全管理员。
SQLADM:允许监控和调整 SQL 语句。
WLMADM:允许充当工作负载管理员
权限
SETSESSIONUSER
授权 ID 权限涉及对授权 ID 的操作。只有一个权限,称为 SETSESSIONUSER 权限。它可以授予用户或组,并且它允许会话用户将身份切换到已授予权限的任何授权 ID。此权限由用户 SECADM 权限授予。
模式权限
这些权限涉及数据库中模式的操作。模式的所有者拥有所有操作模式对象(如表、视图、索引、包、数据类型、函数、触发器、过程和别名)的权限。可以向用户、组、角色或 PUBLIC 授予以下任何权限
- CREATEIN:允许在模式内创建对象
- ALTERIN:允许修改模式内的对象。
DROPIN
这允许删除模式内的对象。
表空间权限
这些权限涉及数据库中表空间的操作。用户可以被授予表空间的 USE 权限。然后,这些权限允许他们在表空间内创建表。权限所有者可以在创建表空间时使用 WITH GRANT OPTION 命令授予表空间的 USE 权限。而 SECADM 或 ACCESSCTRL 权限拥有对表空间的 USE 权限。
表和视图权限
用户必须对数据库具有 CONNECT 权限才能使用表和视图权限。表和视图的权限如下所示
CONTROL
它提供表或视图的所有权限,包括删除和授予、撤销对用户的各个表权限。
ALTER
它允许用户修改表。
DELETE
它允许用户从表或视图中删除行。
INDEX
它允许用户将行插入表或视图。它还可以运行导入实用程序。
REFERENCES
它允许用户创建和删除外键。
SELECT
它允许用户从表或视图中检索行。
UPDATE
它允许用户更改表、视图中的条目。
包权限
用户必须对数据库具有 CONNECT 权限。包是一个数据库对象,其中包含数据库管理器的信息,以便以最有效的方式为特定应用程序访问数据。
CONTROL
它为用户提供重新绑定、删除或执行包的权限。拥有此权限的用户会被授予 BIND 和 EXECUTE 权限。
BIND
它允许用户绑定或重新绑定该包。
EXECUTE
允许执行包。
索引权限
此权限会自动接收索引上的 CONTROL 权限。
序列权限
序列会自动接收序列上的 USAGE 和 ALTER 权限。
例程权限
它涉及数据库内例程(如函数、过程和方法)的操作。
DB2 - 角色
简介
角色是一个数据库对象,它对可以分配给用户、组、PUBLIC 或其他角色的多个权限进行分组,方法是使用 GRANT 语句。
角色限制
- 角色不能拥有数据库对象。
- 在创建以下数据库对象时,不会考虑授予组的权限和角色。
- 包含静态 SQL 的包
- 视图
- 物化查询表 (MQT)
- 触发器
- SQL 例程
创建角色和授予角色成员资格
语法:[创建新角色]
db2 create role <role_name>
示例:[创建名为“sales”的新角色,以添加一些由某些用户或组管理的表]
db2 create role sales
输出
DB20000I The SQL command completed successfully.
将 DBADM 角色授予特定表
语法:[将角色的权限授予表]
db2 grant select on table <table_name> to role <role_name>
示例:[将管理表“shope.books”的权限添加到角色“sales”]
db2 grant select on table shope.books to role sales
输出
DB20000I The SQL command completed successfully.
安全管理员将角色授予所需的用户。(在使用此命令之前,需要创建用户。)
语法:[将用户添加到角色]
db2 grant role <role_name> to user <username>
示例:[将用户“mastanvali”添加到角色“sales”]
db2 grant sales to user mastanvali
输出
DB20000I The SQL command completed successfully.
角色层次结构
为了创建角色的层次结构,每个角色都被授予另一个角色的权限/成员资格。
语法:[在此语法之前,创建一个名为“production”的新角色]
db2 grant role <roll_name> to role <role_name>
示例:[将角色“sales”的权限提供给另一个角色“production”]
db2 grant sales to role production
DB2 - LDAP
简介
LDAP 是轻量级目录访问协议。LDAP 是一种全局目录服务,行业标准协议,基于客户端-服务器模型,并在 TCP/IP 协议栈之上运行。LDAP 提供了一种连接、访问、修改和搜索互联网目录的工具。
LDAP 服务器包含以目录树形式组织的信息。客户端要求服务器提供信息或对特定信息执行某些操作。如果服务器拥有所需的信息,则会通过提供所需信息来回复客户端,或者将客户端引导到另一台服务器以对所需信息进行操作。然后,客户端从另一台服务器获取所需的信息。
目录的树结构在所有参与的服务器中保持一致。这是 LDAP 目录服务的突出特点。因此,无论客户端引用哪台服务器,客户端始终都能以无错误的方式获取所需的信息。在这里,我们使用 LDAP 对 IBM DB2 进行身份验证,以取代操作系统身份验证。
LDAP 有两种类型
- 透明
- 插件
让我们看看如何配置透明 LDAP。
配置透明 LDAP
要开始配置透明 LDAP,您需要配置 LDAP 服务器。
LDAP 服务器配置
创建一个 SLAPD.conf 文件,其中包含有关 LDAP 中用户和组对象的所有信息。安装 LDAP 服务器时,默认情况下会在您的机器上使用基本 LDAP 目录树进行配置。
下表显示修改后的文件配置。
代码框中用黄色突出显示的文本表示以下内容
DBA 用户 ID =“db2my1”,组 =“db1my1adm”,密码 =“db2my1”管理员用户 ID =“my1adm”,组 =“dbmy1ctl”。
# base dn: example.com dn: dc=example,dc=com dc: example o: example objectClass: organization objectClass: dcObject # pc box db dn: dc=db697,dc=example,dc=com dc: db697 o: db697 objectClass: organization objectClass: dcObject # # Group: dbadm # dn: cn=dbmy1adm,dc=db697,dc=example,dc=com cn: dbmy1adm objectClass: top objectClass: posixGroup gidNumber: 400 objectClass: groupOfNames member: uid=db2my1,cn=dbmy1adm,dc=db697,dc=example,dc=com memberUid: db2my1 # # User: db2 # dn: uid=db2my1,cn=dbmy1adm,dc=db697,dc=example,dc=com cn: db2my1 sn: db2my1 uid: db2my1 objectClass: top objectClass: inetOrgPerson objectClass: posixAccount uidNumber: 400 gidNumber: 400 loginShell: /bin/csh homeDirectory: /db2/db2my1 # # Group: db ctl # dn: cn=dbmy1ctl,dc=db697,dc=example,dc=com cn: dbmy1ctl objectClass: top objectClass: posixGroup gidNumber: 404 objectClass: groupOfNames member: uid=my1adm,cn=dbmy1adm,dc=db697,dc=example,dc=com memberUid: my1adm # # User: adm # dn: uid=my1adm,cn=dbmy1ctl,dc=db697,dc=example,dc=com cn: my1adm sn: my1adm uid: my1adm objectClass: top objectClass: inetOrgPerson objectClass: posixAccount uidNumber: 404 gidNumber: 404 loginShell: /bin/csh homeDirectory: /home/my1adm
将上述文件保存为“/var/lib/slapd.conf”,然后使用以下命令执行此文件以将这些值添加到 LDAP 服务器中。这是一个 Linux 命令;不是 db2 命令。
ldapadd r- -D ‘cn=Manager,dc=example,dc=com” –W –f /var/lib/slapd.conf
在 LDAP 服务器上注册 DB2 用户和 DB2 组后,登录到您已安装实例和数据库的特定用户。您需要配置 LDAP 客户端以确认客户端服务器所在的位置,无论是远程还是本地。
LDAP 客户端配置
LDAP 客户端配置保存在文件“ldap.conf”中。有两个文件可用于配置参数,一个是通用的,另一个是特定的。您应该在“/etc/ldap.conf”中找到第一个文件,第二个文件位于“/etc/openldap/ldap.conf”中。
以下数据在通用 LDAP 客户端配置文件中可用
# File: /etc/ldap.conf # The file contains lots of more entries and many of them # are comments. You show only the interesting values for now host localhost base dc=example,dc=com ldap_version 3 pam_password crypt pam_filter objectclass=posixAccount nss_map_attribute uniqueMember member nss_base_passwd dc=example,dc=com nss_base_shadow dc=example,dc=com nss_base_group dc=example,dc=com
您需要根据 DB2 配置更改服务器和域信息的位置。如果我们在同一系统中使用服务器,则在“host”中将其指定为“localhost”,在“base”中,您可以配置在 LDAP 服务器的“SLAPD.conf”文件中提到的内容。
可插拔身份验证模块 (PAM) 是用于身份验证服务的 API。这是 LDAP 身份验证与加密密码和类型为 posixAccount 的特殊 LDAP 对象的通用接口。此类型的所有 LDAP 对象都表示具有可移植操作系统接口 (POSIX) 属性的帐户的抽象。
网络安全服务 (NSS) 是一组库,用于支持安全启用客户端和服务器应用程序的跨平台开发。这包括 SSL、TLS、PKCS S/MIME 和其他安全标准等库。
您需要为该接口指定基本 DN 和两个其他映射属性。OpenLDAP 客户端配置文件包含以下条目
host localhost base dc=example,dc=com
到目前为止,您只定义了 LDAP 服务器的主机和基本 DN。
验证 OpenLDAP 环境
配置完 LDAP 服务器和 LDAP 客户端后,验证两者之间的通信。
步骤 1:检查您的本地 LDAP 服务器是否正在运行。使用以下命令
ps -ef | grep -i ldap
此命令应列出表示 LDAP 服务器的 LDAP 守护进程
/usr/lib/openldap/slapd -h ldap:/// -u ldap -g ldap -o slp=on
这表示您的 LDAP 服务器正在运行并正在等待来自客户端的请求。如果先前命令没有此类进程,则可以使用“rcldap”命令启动 LDAP 服务器。
rcldap start
服务器启动后,您可以通过发出以下命令在文件“/var/log/messages/”中监控它。
tail –f /var/log/messages
使用 ldapsearch 测试与 LDAP 服务器的连接
ldapsearch 命令打开与 LDAP 服务器的连接,绑定到它并执行搜索查询,可以使用特殊参数“-x”指定,使用 -x 参数连接到您的 LDAP 服务器,使用简单的身份验证机制,而不是更复杂的机制,如简单身份验证和安全层 (SASL)
ldapsearch –x
LDAP 服务器应回复以下响应,其中包含 LDAP 数据交换格式 (LDIF) 中的所有 LDAP 条目。
# extended LDIF # # LDAPv3 # base <> with scope subtree # filter: (objectclass=*) # requesting: ALL # example.com dn: dc=example, dc=com dc: example o: example objectClass: organization objectClass: dcObject # search result search: 2 result: 0 Success # numResponses: 2 # numEntries: 1
配置 DB2
在使用 LDAP 服务器和客户端之后,您需要配置我们的 DB2 数据库以与 LDAP 一起使用。让我们讨论一下,如何安装和配置数据库以使用我们的 LDAP 环境进行 DB2 用户身份验证过程。
配置 DB2 和 LDAP 交互插件
IBM 提供了一个包含 DB2 的 LDAP 插件的免费包。DB2 包为以下每个插件包含三个 DB2 安全插件
- 服务器端身份验证
- 客户端身份验证
- 组查找
根据您的需求,您可以使用这三个插件中的任何一个或全部。此插件不支持某些用户在 LDAP 中定义而其他用户在操作系统中定义的环境。如果您决定使用 LDAP 插件,则需要在 LDAP 服务器中定义与数据库关联的所有用户。相同的原则也适用于组插件。
您必须决定哪些插件对我们的系统是强制性的。客户端身份验证插件用于用户 ID 和在 CONNECT 或 ATTACH 语句中提供的密码验证在客户端系统上发生的场景。因此,数据库管理器配置参数 SRVCON_AUTH 或 AUTHENTICATION 需要设置为 CLIENT 值。客户端身份验证难以保证安全,通常不建议使用。服务器插件通常建议使用,因为它执行用户 ID 和密码的服务器端验证,如果客户端执行 CONNECT 或 ATTACH 语句,这是一种安全的方式。服务器插件还提供了一种将 LDAP 用户 ID 映射到 DB2 授权 ID 的方法。
现在您可以开始安装和配置 DB2 安全插件,您需要考虑 DB2 所需的目录信息树。DB2 使用间接授权,这意味着用户属于一个组,并且该组被授予了较少的权限。您需要在 LDAP 目录中定义所有 DB2 用户和 DB2 组。
图像
LDIF 文件 openldap.ldif 应包含以下代码
# # LDAP root object # example.com # dn: dc=example, dc=com dc: example o: example objectClass: organization objectClass: dcObject # # db2 groups # dn: cn=dasadm1,dc=example,dc=com cn: dasadm1 objectClass: top objectClass: posixGroup gidNumber: 300 objectClass: groupOfNames member: uid=dasusr1,cn=dasadm1,dc=example,dc=com memberUid: dasusr1 dn: cn=db2grp1,dc=example,dc=com cn: db2grp1 objectClass: top objectClass: posixGroup gidNumber: 301 objectClass: groupOfNames member: uid=db2inst2,cn=db2grp1,dc=example,dc=com memberUid: db2inst2 dn: cn=db2fgrp1,dc=example,dc=com cn: db2fgrp1 objectClass: top objectClass: posixGroup gidNumber: 302 objectClass: groupOfNames member: uid=db2fenc1,cn=db2fgrp1,dc=example,dc=com memberUid: db2fenc1 # # db2 users # dn: uid=dasusr1, cn=dasadm1, dc=example,dc=com cn: dasusr1 sn: dasusr1 uid: dasusr1 objectClass: top objectClass: inetOrgPerson objectClass: posixAccount uidNumber: 300 gidNumber: 300 loginShell: /bin/bash homeDirectory: /home/dasusr1 dn: uid=db2inst2,cn=db2grp1,dc=example,dc=com cn: db2inst2 sn: db2inst2 uid: db2inst2 objectClass: top objectClass: inetOrgPerson objectClass: posixAccount uidNumber: 301 gidNumber: 301 loginShell: /bin/bash homeDirectory: /home/db2inst2 dn: uid=db2fenc1,cn=db2fgrp1,dc=example,dc=com cn: db2fenc1 sn: db2fenc1 uid: db2fenc1 objectClass: top objectClass: inetOrgPerson objectClass: posixAccount uidNumber: 303 gidNumber: 303 loginShell: /bin/bash homeDirectory: /home/db2fenc1
创建一个名为“db2.ldif”的文件并将上述示例粘贴到其中。使用此文件,将定义的结构添加到您的 LDAP 目录中。
要将 DB2 用户和 DB2 组添加到 LDAP 目录,您需要将用户绑定为“rootdn”到 LDAP 服务器,以获取准确的权限。
执行以下语法以使用我们 LDIF 文件“db2.ldif”中定义的所有对象填充 LDAP 信息目录
ldapadd –x –D “cn=Manager, dc=example,dc=com” –W –f <path>/db2.ldif
使用更多参数执行搜索结果
ldapsearch –x |more
为 DB2 使用准备文件系统
为我们的 LDAP 用户 db2inst2 创建实例。此用户需要主目录,其中包含主目录内的两个空文件。在创建新实例之前,需要创建一个将成为实例所有者的用户。
创建实例用户后,您必须在用户主目录中创建文件“.profile”和“.login”,这些文件将由 DB2 修改。要在目录中创建此文件,请执行以下命令
mkdir /home/db2inst2 mkdir /home/db2inst2/.login mkdir /home/db2inst2/.profile
您已在 LDAP 目录中注册了与 DB2 相关的所有用户和组,现在您可以使用实例所有者 ID“db2inst2”创建名为“db2inst2”的实例,并使用用于运行用户定义函数 (UDF) 或存储过程的隔离用户 ID“db2fenc1”。
/opt/ibm/db2/V10.1/instance/db2icrt –u db2fenc1 db2inst2 DBI1070I Program db2icrt completed successfully.
现在检查实例主目录。您可以看到一个名为“sqllib”的新子目录以及为 DB2 使用而自定义的“.profile”和“.login”文件。
配置用于 LDAP 支持的 DB2 身份验证公共插件
将所需的 LDAP 插件复制到相应的 DB2 目录
cp // /v10/IBMLDAPauthserver.so /home/db2inst2/sqllib/security /plugin/server/. cp / / /v10/IBMLDAPgroups.so /home/db2inst2/sqllib/security /plugin/group/.
将插件复制到指定目录后,您需要登录到 DB2 实例所有者并将数据库管理器配置更改为使用这些插件。
Su – db2inst2 db2inst2> db2 update dbm cfg using svrcon_pw_plugin IBMLDAPauthserver db2inst2> db2 update dbm cfg using group_plugin IBMLDAPgroups db2inst2> db2 update dbm cfg using authentication SERVER_ENCRYPT db2inst2> db2stop db2inst2> db2start
此修改在您启动 DB2 实例后生效。重新启动实例后,需要安装和配置名为“IBMLDAPSecurity.ini”的主要 DB2 LDAP 配置文件,以使 DB2 插件与当前 LDAP 配置一起工作。
IBMLDAPSecurity.ini 文件包含
;----------------------------------------------------------- ; SERVER RELATED VALUES ;----------------------------------------------------------- ; Name of your LDAP server(s). ; This is a space separated list of LDAP server addresses, ; with an optional port number for each one: ; host1[:port] [host2:[port2] ... ] ; The default port number is 389, or 636 if SSL is enabled. LDAP_HOST = my.ldap.server ;----------------------------------------------------------- ; USER RELATED VALUES ;----------------------------------------------------------- rs ; LDAP object class used for use USER_OBJECTCLASS = posixAccount ; LDAP user attribute that represents the "userid" ; This attribute is combined with the USER_OBJECTCLASS and ; USER_BASEDN (if specified) to construct an LDAP search ; filter when a user issues a DB2 CONNECT statement with an ; unqualified userid. For example, using the default values ; in this configuration file, (db2 connect to MYDB user bob ; using bobpass) results in the following search filter: OrgPerson)(uid=bob) ; &(objectClass=inet USERID_ATTRIBUTE = uid representing the DB2 authorization ID ; LDAP user attribute, AUTHID_ATTRIBUTE = uid ;----------------------------------------------------------- ; GROUP RELATED VALUES ;----------------------------------------------------------- ps ; LDAP object class used for grou GROUP_OBJECTCLASS = groupOfNames at represents the name of the group ; LDAP group attribute th GROUPNAME_ATTRIBUTE = cn ; Determines the method used to find the group memberships ; for a user. Possible values are: ; SEARCH_BY_DN - Search for groups that list the user as ; a member. Membership is indicated by the ; group attribute defined as ; GROUP_LOOKUP_ATTRIBUTE. ; USER_ATTRIBUTE - A user's groups are listed as attributes ; of the user object itself. Search for the ; user attribute defined as TRIBUTE to get the groups. ; GROUP_LOOKUP_AT GROUP_LOOKUP_METHOD = SEARCH_BY_DN ; GROUP_LOOKUP_ATTRIBUTE ; Name of the attribute used to determine group membership, ; as described above. llGroups ; GROUP_LOOKUP_ATTRIBUTE = ibm-a GROUP_LOOKUP_ATTRIBUTE = member
现在在当前实例目录中找到文件 IBMLDAPSecurity.ini 文件。将上述示例内容复制到其中。
Cp //db2_ldap_pkg/IBMLDAPSecurity.ini /home/db2inst2/sqllib/cfg/
现在您需要使用以下两个语法重新启动 DB2 实例
db2inst2> db2stop Db2inst2> db2start
此时,如果您尝试使用“db2start”命令,您将收到安全错误消息。因为,DB2 安全配置尚未针对您的 LDAP 环境正确配置。
自定义两种配置
保留 LDAP_HOST 名称,它在 slapd.conf 文件中配置。
现在编辑 IMBLDAPSecurity.ini 文件并键入 LDAP_HOST 名称。这两个文件中 LDAP_HOST 名称必须相同。
文件内容如下所示
;----------------------------------------------------------- ; SERVER RELATED VALUES ;----------------------------------------------------------- LDAP_HOST = localhost ;----------------------------------------------------------- ; USER RELATED VALUES ---------------------------- ;------------------------------- USER_OBJECTCLASS = posixAccount USER_BASEDN = dc=example,dc=com USERID_ATTRIBUTE = uid AUTHID_ATTRIBUTE = uid ;----------------------------------------------------------- ; GROUP RELATED VALUES ;----------------------------------------------------------- GROUP_OBJECTCLASS = groupOfNames GROUP_BASEDN = dc=example,dc=com GROUPNAME_ATTRIBUTE = cn GROUP_LOOKUP_METHOD = SEARCH_BY_DN GROUP_LOOKUP_ATTRIBUTE = member
更改这些值后,LDAP 会立即生效,并且您的 DB2 环境与 LDAP 完美配合。
您可以注销并重新登录到“db2inst2”用户。
现在您的实例正在使用 LDAP 目录。