关于触发器、视图、物化视图、序列、同 义词、自增列、外部链接等基本的操作

触发器
创建触发器
Create or replace trigger ss before delete on aa for each row begin print 11;end;
重编触发器
Alter triger sysdba.ss compile
删除触发器
Drop trigger ss
触发器分类
触发器是应用程序分割技术的一个基本组成部分,它将事务规则从应用程序的代码中移
到数据库中,从而可确保加强这些事务规则并提高它们的性能。
DM 提供了三种类型的触发器:
1.表级触发器:基于表中的数据进行触发;
2. 事件触发器:基于特定系统事件进行触发;
3. 时间触发器:基于时间而进行触发。
触发器是依附于某个具体的表或视图的特殊存储过程,它在某个 DML 操作的激发下自动执行。在创建触发器时应该仔细考虑它的相关信息。具体来说,应该考虑以下几个方面的问题:

  1. 触发器应该建立在哪个表/视图之上;
  2. 触发器应该对什么样的 DML 操作进行响应;
  3. 触发器在指定的 DML 操作之前激发还是在之后激发;
  4. 对每次 DML 响应一次,还是对受 DML 操作影响的每一行数据都响应一次。
    管理触发器
    在确定了触发器的实现细节后,现在就可以创建触发器了

视图
创建视图
Create view w as select * from ss
编译视图
Alter view sysdba.w compile
查看视图
SELECT * FROM SYS.SYSOBJECTS a, SYS.SYSTEXTS b WHERE a.ID = b.ID AND NAME=‘w’ ;
删除视图
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
    默认选项。当快速刷新可用时采用快速刷新,否则采用完全刷新。
    刷新时机
    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 进行更改。
    刷新选项
    WITH PRIMARY KEY
    默认选项。
    只能基于单表
    必须含有 PRIMARY KEY 约束,选择列必须直接含有所有的 PRIMARY
    KEY(UPPER(col_name)的形式不可接受)
    不能含有对象类型
    WITH ROWID
    只能基于单表
    不能含有对象类型
    如果使用 WITH ROWID 的同时使用快速刷新,则必须将 ROWID 提取
    出来,和其他列名一起,以别名的形式显示
    QUERY REWRITE 选项
    ENABLE
    允许物化视图用于查询改写。
    DISABLE
    禁止物化视图用于查询改写。
    目前 DM8 仅语法支持查询改写选项,实际功能未实现。
    datetime_expr 只能是日期常量表达式,SYSDATE[+<数值常量>]或日期间隔;
    如果物化视图中包含大字段列,需要用户手动指定 STORAGE(USING LONG ROW)
    的存储方式。
    物化视图创建
    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天物化视图更新
    物化视图删除
    DROP MATERIALIZED VIEW if exists sysdba.qq
    物化视图修改
    ALTER MATERIALIZED VIEW SYSDBA.qq REFRESH COMPLETE
    修改为完全删除
    物化视图更新
    REFRESH MATERIALIZED VIEW sysdba.qq force
    物化日志创建
    CREATE MATERIALIZED VIEW LOG ON sysdba.qq WITH
    ROWID(id,name ,name2) PURGE START WITH SYSDATE + 5 REPEAT INTERVAL ‘1’ DAY;
    物化视图日志删除
    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 访问这个值,不管另一个用户是否增加这个序列。
    创建序列
    CREATE SEQUENCE SEQ INCREMENT BY 10;
    修改序列
    ALTER SEQUENCE SEQ1 INCREMENT BY 1 ;
    删除序列
    DROP SEQUENCE IF EXISTS SYSDBA.SEQ

步长

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

同义词
创建同义词
CREATE OR REPLACE SYNONYM sysdba.www FOR sysdba.aa
SELECT COUNT(*) FROM sysdba.www;
删除同义词
DROP SYNONYM sysdba.www;

自增列
创建自增列
SET IDENTITY_INSERT 属性
设置是否允许将显式值插入表的自增列中。ON 是,OFF 否。
语法格式
SET IDENTITY_INSERT [<模式名>.]<表名> ON WITH REPLACE NULL;
SET IDENTITY_INSERT [<模式名>.]<表名> OFF;
SET IDENTITY_INSERT PERSON.PERSON_TYPE ON;
INSERT INTO SYSDBA.WWW(ID,NAME)VALUES(5,‘SD’)
当为off时无法指定自增列值
SET IDENTITY_INSERT SYSDBA.WWW ON WITH REPLACE NULL;
INSERT INTO SYSDBA.WWW(ID,NAME) VALUES(NULL,‘DS’)
当设置后 null替换自增值
在表中创建一个自增列。该属性与 CREATE TABLE 语句一起使用,一个表只能有一个
自增列
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 的详细配置
可参考《DM8 系统管理员手册》的 2.1 节,需要注意同时将 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 将根据设定的<连接类型>,在剩余的服
务器中挑选合适的服务器进行连接。
CREATE PUBLIC LINK LINK1 CONNECT ‘DAMENG’ WITH SYSDBA IDENTIFIED BY SYSDBA USING ‘192.168.0.31/5369’;
(二) 通过连接描述符创建
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 地址>/<服务名>创建
CREATE LINK LINK1 CONNECT ‘ORACLE’ WITH USER01 IDENTIFIED BY USER01 USING
‘192.168.0.225/orcl’;
5.7.2.删除外部链接
DROP LINK LINK1;

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据库中的数据发生变化时,可以通过触发器来执行特定的操作。下面是一个示例,演示了如何使用PostgreSQL数据库触发器来更新物化视图。 假设我们有两个表:orders(存储订单信息)和 order_summary(存储订单汇总信息),我们希望在orders表中的数据发生变化时,自动更新order_summary表中的数据。 首先,我们需要创建orders表和order_summary表: ```sql CREATE TABLE orders ( order_id SERIAL PRIMARY KEY, customer_id INT, order_date DATE, total_amount DECIMAL ); CREATE TABLE order_summary ( summary_id SERIAL PRIMARY KEY, total_orders INT, total_amount DECIMAL ); ``` 接下来,我们创建一个触发器函数,用于在orders表中的数据变化时更新order_summary表: ```sql CREATE OR REPLACE FUNCTION update_order_summary() RETURNS TRIGGER AS $$ BEGIN -- 更新总订单数和总金额 UPDATE order_summary SET total_orders = (SELECT COUNT(*) FROM orders), total_amount = (SELECT SUM(total_amount) FROM orders); RETURN NULL; END; $$ LANGUAGE plpgsql; ``` 然后,我们创建一个触发器,将其与orders表关联,并指定在INSERT、UPDATE和DELETE操作触发时执行刚刚创建的触发器函数: ```sql CREATE TRIGGER update_summary_trigger AFTER INSERT OR UPDATE OR DELETE ON orders FOR EACH STATEMENT EXECUTE FUNCTION update_order_summary(); ``` 现在,每当我们向orders表中插入、更新或删除数据时,触发器函数update_order_summary()都会自动执行,并更新order_summary表中的数据。 这只是一个简单的示例,演示了如何使用PostgreSQL触发器来更新物化视图。实际应用中,触发器可以执行更复杂的操作,以满足特定的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值