达梦数据库_触发器、视图、物化视图、序列、同义词、自增列、外部链接等基本的操作

触发器

创建触发器

SQL> create or replace trigger ss before delete on aa for each row begin print 11;end

重编触发器

SQL> alter triger sysdba.ss compile;

删除触发器

SQL> drop trigger ss;

触发器分类

触发器是应用程序分割技术的一个基本组成部分,它将事务规则从应用程序的代码中移到数据库中,从而可确保加强这些事务规则并提高它们的性能。

DM 提供了三种类型的触发器:

1. 表级触发器:基于表中的数据进行触发;

2. 事件触发器:基于特定系统事件进行触发;

3. 时间触发器:基于时间而进行触发。

触发器是依附于某个具体的表或视图的特殊存储过程,它在某个 DML 操作的激发下自动执行。在创建触发器时应该仔细考虑它的相关信息。具体来说,应该考虑以下几个方面的问题:

1. 触发器应该建立在哪个表/视图之上;

2. 触发器应该对什么样的 DML 操作进行响应;

3. 触发器在指定的 DML 操作之前激发还是在之后激发;

4. 对每次 DML 响应一次,还是对受 DML 操作影响的每一行数据都响应一次。

视图

创建视图

SQL> create view w as select * from ss;

编译视图

SQL> alter view sysdba.w compile;

查看视图

SQL> SELECT * FROM SYS.SYSOBJECTS a, SYS.SYSTEXTS b WHERE a.ID = b.ID AND NAME=‘w’ ;

删除视图

SQL> drop view if exists sysdba.w cascade;

视图删除有两种方式:RESTRICT/CASCADE 方式。其中 RESTRICT 为缺省值。

当设置 dm.ini 中的参数 DROP_CASCADE_VIEW 值为 1 时,如果在该视图上建有其它视图,必须使用 CASCADE 参数才可以删除所有建立在该视图上的视图,否则删除视图的操作不会成功;当设置 dm.ini 中的参数 DROP_CASCADE_VIEW 值为 0 时,RESTRICT 和 CASCADE方式都会成功,且只会删除当前视图,不会删除建立在该视图上的视图。

物化视图

参数

  1. <模式名> 指明被创建的视图属于哪个模式,缺省为当前模式;
  2. <物化视图名> 指明被创建的物化视图的名称;
  3. <列名> 指明被创建的物化视图中列的名称;
  4. [BUILD IMMEDIATE|BUILD DEFERRED] 指明 BUILD IMMEDIATE 为立即填充数据,默认为立即填充;BUILD DEFERRED 为延迟填充,使用这种方式要求第一次刷新必须为 COMPLETE 完全刷新。
  5. <子查询表达式> 标识物化视图所基于的表的行和列。其语法遵照 SELECT 语句的语法规则;
  6. <表连接> 请参看第四章表连接查询部分;
  7. 定义查询中的 ORDER BY 子句仅在创建物化视图时使用,此后 ORDER BY 被忽略;
  8. 刷新模式

FAST:根据相关表上的数据更改记录进行增量刷新。普通 DML 操作生成的记录存在于物化视图日志。使用 FAST 刷新之前,必须先建好物化视图日志。

COMPLETE:通过执行物化视图的定义脚本进行完全刷新。

FORCE:默认选项。当快速刷新可用时采用快速刷新,否则采用完全刷新。

  1. 刷新时机

ON COMMIT:在相关表上视图提交时进行快速刷新。刷新是由异步线程执行的,因此COMMIT 执行结束后可能需要等待一段时间物化视图数据才是最新的。

约束:含有对象类型的不支持;包含远程表的不支持。

START WITH … NEXT:START WITH 用于指定首次刷新物化视图的时间,NEXT 指定自动刷新的间隔;如果省略 START WITH 则首次刷新时间为当前时间加上 NEXT 指定的间隔;如果指定 START WITH 省略 NEXT 则物化视图只会刷新一次;如果二者都未指定物化视图不会自动刷新。

ON DEMAND:由用户通过 REFRESH 语法进行手动刷新。如果指定了 START WITH 和 NEXT子句就没有必要指定 ON DEMAND。

NEVER REFRESH:物化视图从不进行刷新。可以通过 ALTER MATERALIZED VIEW <物化视图名> FRESH 进行更改。

  1. 刷新选项

WITH PRIMARY KEY:默认选项。

只能基于单表;

必须含有 PRIMARY KEY 约束,选择列必须直接含有所有的 PRIMARY KEY(UPPER(col_name)的形式不可接受);

不能含有对象类型。

WITH ROWID

只能基于单表;

不能含有对象类型;

如果使用 WITH ROWID 的同时使用快速刷新,则必须将 ROWID 提取出来,和其他列名一起,以别名的形式显示。

  1. QUERY REWRITE 选项

ENABLE:允许物化视图用于查询改写。

DISABLE:禁止物化视图用于查询改写。

目前 DM8 仅语法支持查询改写选项,实际功能未实现。

  1. datetime_expr 只能是日期常量表达式,SYSDATE[+<数值常量>]或日期间隔;
  2. 如果物化视图中包含大字段列,需要用户手动指定 STORAGE(USING LONG ROW)的存储方式。

物化视图创建

SQL> create MATERIALIZED view sysdba.qq BUILD IMMEDIATE REFRESH WITH ROWID START WITH SYSDATE NEXT SYSDATE+3 AS select id,name,uname from utest where iname=’123’;

创建物化视图qq对iname=’123’条件,id,name,uname

依据 ROWID 刷新且刷新间隔为3天物化视图更新

物化视图删除

SQL> DROP MATERIALIZED VIEW if exists sysdba.qq;

物化视图修改

SQL> ALTER MATERIALIZED VIEW SYSDBA.qq REFRESH COMPLETE;

修改为完全删除

物化视图更新

SQL> REFRESH MATERIALIZED VIEW sysdba.qq force;

物化日志创建

SQL> CREATE MATERIALIZED VIEW LOG ON sysdba.qq WITH ROWID(id,name ,name2) PURGE START WITH SYSDATE + 5 REPEAT INTERVAL ‘1’ DAY;

物化视图日志删除

SQL> DROP MATERIALIZED VIEW LOG ON sysdba.qq;

序列

概念

序列(sequence)是 DM 数据库中的数据库实体之一。通过使用序列,多个用户可以产生和使用一组不重复的有序整数值。比如可以用序列来自动地生成主关键字值。序列通过提供唯一数值的顺序表来简化程序设计工作。

当一个序列第一次被查询调用时,它将返回一个预定值,该预定值就是在创建序列时所指定的初始值。默认情况下,对于升序序列,序列的缺省初始值为序列的最小值,对于降序序列,缺省初始值为序列的最大值。可以指定序列能生成的最大值,默认情况下,降序序列的最大值缺省为-1,升序序列的最大值为 263-1;也可以指定序列能生成的最小值,默认情况下,升序序列的最小值缺省为 1,降序序列的最小值为-263。序列的最大值和最小值可以指定为 longint(4 个字节)所能表示的最大和最小有符号整数。

在随后的每一次查询中,序列将产生一个按其指定的增量增长的值。增量可以是任意的正整数或负整数,但不能为 0。如果此值为负,序列是下降的,如果此值为正,序列是上升的。默认情况下,增加缺省为 1。

一旦序列生成,用户就可以在 SQL 语句中用以下伪列来存取序列的值:

  1. CURRVAL 返回当前的序列值;
  2. NEXTVAL 如果为升序序列,序列值增加并返回增加后的值;如果为降序序列,序列值减少并返回减少后的值。

序列可以是循环的,当序列的值达到最大值/最小值时,序列将从最小值/最大值计数。使用一个序列时,不保证将生成一串连续不断递增的值。例如,如果查询一个序列的下一个值供 insert 使用,则该查询是能使用这个序列值的唯一会话。如果未能提交事务处理,则序列值就不被插入表中,以后的 insert 将继续使用该序列随后的值。

序列在对编号的使用上具有很大用处,如果想对表建立一个列专门用来表示编号,如订单号,这样就可以使用序列,依次递增生成,用户不需进行特殊管理,这给用户带来了很大方便。如果用户需要间隔的编号,创建序列时指定 INCREMENT,就可以生成用户需要的编号。

使用 NEXTVAL:第一次访问一个序列,在引用 sequence.CURRVAL 之前必须先引用 sequence.NEXTVAL。第一次引用NEXTVAL,返回序列的初始值。后面每次引用 NEXTVAL,用已定义的 step 增加序列值并返回序列新的增加以后的值。

使用 CURRVAL:任何对 CURRVAL 的引用返回指定序列的当前值,该值是最后一次对 NEXTVAL 的引用所返回的值。用 NEXTVAL生成一个新值以后,可以继续使用 CURRVAL 访问这个值,不管另一个用户是否增加这个序列。

创建序列

SQL> CREATE SEQUENCE SEQ INCREMENT BY 10;

修改序列

SQL> ALTER SEQUENCE SEQ1 INCREMENT BY 1;

删除序列

SQL> DROP SEQUENCE IF EXISTS SYSDBA.SEQ;

步长

  1. 关于步长的修改,分两种情况:a) 如果在修改前没有用NEXTVAL访问序列,创建完序列后直接修改序列步长值, 则序列的当前值为起始值加上新步长值与旧步长值的差;b) 如果在修改前用 NEXTVAL 访问了序列,然后修改序列步长值,则再次访问序 列的当前值为序列的上一次的值加上新步长值。
  2. 缺省序列选项:如果在修改序列语句中没有指出某选项则缺省是修改前的选项值。 不允许未指定任何选项、禁止重复或冲突的选项说明;
  3. 序列的起始值不能修改;
  4. 修改序列的最小值不能大于起始值、最大值不能小于起始值;
  5. 修改序列的步长的绝对值必须小于MAXVALUE与MINVALUE的差;
  6. 序列的当前值不能大于最大值,不能小于最小值;
  7. 修改序列的当前值后,需要使用NEXTVAL获取修改后的序列当前值。

同义词

创建同义词

SQL> CREATE OR REPLACE SYNONYM sysdba.www FOR sysdba.aa

SQL> SELECT COUNT(*) FROM sysdba.www;

删除同义词

SQL> DROP SYNONYM sysdba.www;

自增列

创建自增列

SET IDENTITY_INSERT 属性,设置是否允许将显式值插入表的自增列中。ON 是,OFF 否。

语法格式

SQL> SET IDENTITY_INSERT [<模式名>.]<表名> ON WITH REPLACE NULL;

SQL> SET IDENTITY_INSERT [<模式名>.]<表名> OFF;



SQL> SET IDENTITY_INSERT PERSON.PERSON_TYPE ON;

SQL> INSERT INTO SYSDBA.WWW(ID,NAME)VALUES(5,‘SD’);

当为off时无法指定自增列值

SQL> SET IDENTITY_INSERT SYSDBA.WWW ON WITH REPLACE NULL;

SQL> INSERT INTO SYSDBA.WWW(ID,NAME) VALUES(NULL,‘DS’);

当设置后 null替换自增值。在表中创建一个自增列。该属性与 CREATE TABLE 语句一起使用,一个表只能有一个自增列。

SQL> CREATE TABLE www(id int IDENTITY(1,1),name varchar (20));

外部链接

使用说明

1.要创建到 DM 数据库的外部链接,必须首先配置 dmmal.ini,才能使用 LINK。DM的连接串有两种格式:

INSTANCE_NAME:直接使用远程库的实例名(该实例名必须配置到 dmmal.ini 中);

<IP 地址>/<端口号>:其中端口号为 DM 外部链接服务器的 dmmal.ini 配置中的MAL_PORT 端口号。

dmmal.ini 各配置项的值、前后顺序,必须保持完全一致。dmmal.ini 的详细配置需要注意同时将 dm.ini 中的 MAL_INI参数置为 1 以开启 MAL 系统。

2. 要创建到 ORACLE 的外部链接,可以使用配置的网络服务名<tsn_name>;如果没有配置 tsn_name,可以使用连接描述符或者<IP 地址>/<服务名>作为连接串。

3. 要创建到 ORACLE 的外部链接,需要在当前机器安装 ORACLE 的 OCI 接口,且需要保证 OCI 接口与 DM 版本在 32 位/64 位保持一致。

4.通过 LINK 对远程服务器所作的修改,由用户在本地服务器通过 commit 或rollback 进行提交或回滚。

5.只支持普通用户,不支持 SSL 和 Kerberos 认证。

6.DM8 不支持连接自身实例的 LINK。

7.支持在 CREATE SCHEMA 中 CREATE LINK,但是不支持 CREATE PUBLIC LINK。

8.只有 DBA 和具有 CREATE LINK 权限的用户可以创建外部链接。

9.当 DBLINK 链接的是多机系统且指定了多台服务器时,若所连接的服务器发生宕机等意外情况导致无法对外提供服务时,DBLINK 将根据设定的<连接类型>,在剩余的服务器中挑选合适的服务器进行连接。

(一)通过网络服务名创建

SQL> CREATE LINK LINK1 CONNECT 'ORACLE'WITH USER01 IDENTIFIED BY USER01 USING 'ORCL';

(二)通过连接描述符创建

SQL> CREATE OR REPLACE LINK LINK1 CONNECT 'ORACLE' WITH USER01 IDENTIFIED BY USER01 USING '(DESCRIPTION =(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST =192.168.0.225)(PORT = 1521)))(CONNECT_DATA = (SERVICE_NAME = orcl) ))';

(三)通过<IP地址>/<服务名>创建

SQL> CREATE LINKLINK1 CONNECT 'ORACLE' WITHUSER01 IDENTIFIED BY USER01 USING '192.168.0.225/orcl';

删除外部链接

DROP LINK LINK1;

达梦社区地址:https://eco.dameng.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值