关于使用matlab的data acquisition toolbox的使用

关于使用matlab的data acquisition toolbox的使用,第1张

DB中创建触发器的准则
 
创建trigger时,必须要声明下列属性和行为
√触发器的名称
√主题表的名称
√触发器激活的时间(在修改 *** 作执行前后执行后)
√触发器事件(insert、update、delete)
√旧转换变量值(如果存在)
√新转换变量值(如果存在)
√旧转换表值(如果存在)
√新转换表值(如果存在)
√粒度(fow each row或for each statement)
√触发器的触发动作(包括触发条件和触发语句)
√触发事件是update时,如果仅当update语句中指定了特定列时才应触发触发器,那么就必须声明触发器列列表。
注意:如果激活事件是instead of,那么将对受影响的行集中的每行激活触发 *** 作,而不是执行触发器事件。instead of触发器必须具有for each row粒度,并且主题表必须是视图(view),其他触发器均不能将视图作为主题表。
语法补充说明
详细的语法信息,就不罗嗦了
1)NO CASCADE BEFORE INSERT ON 意味着触发的 *** 作是在数据实际插入表之前发生的,并且触发器的 *** 作将不会导致激活任何其他触发器。对于所有的 BEFORE触发器,要加上关键字NO CASCADE。
2)需要注意的是,只有后触发器和INSTEAD OF触发器中才可以包含下列一个或多个SQL语句
update语句
insert语句
delete语句
merge 语句
 
3)还有的触发动作中有类似如下的
begin atomic
。。。
end
BEGIN ATOMIC 到END 之间定义了的触发器的动作。BEGIN ATOMIC 规定了触发器里的 *** 作要么不执行,要么就要全部执行。如果在触发器 *** 作执行过程中发生了错误,所有 *** 作都将回退以维护数据的完整性。 如果在 BEGIN ATOMIC 和 END 关键字之间输入多个 SQL 语句,则必须以分号(;)或惊叹号(!)结束每个语句如果 SQL 包含单个语句,则不需要 BEGIN ATOMIC 和 END 关键字。
 
4)在DB2 SQL 过程语言允许的注释形式有:
可以使用 / 和 / 来表示多行注释,也可以用 '- -'来表示单行注释
5)在DB2的触发器中,不支持向Oracle那样的SELECT INTO 的语法。要将多列属性值传给多个变量应使用SET (x,y) = (SELECT col_x, col_y FROM table_name)。
6)如果在一个表上定义多个触发器(也就是说,两个 BEFORE INSERT 触发器被定义),他们将按照被创建的次序来被执行。当然,BEFORE 触发器总是在 AFTER 触发器之前被激活而不必考虑其创建次序。表的其他约束条件(如主/外键约束,唯一性约束以及检查约束)同样会在 BEFORE 触发器之后,AFTER 触发器之前被检查。
7)触发器的依赖性
触发器与某个其他对象的所有依赖性都记录在 SYSCATTRIGDEP 目录中。一个触发器可依赖许多个对象。这些对象和从属触发器在 DROP 语句中有更详尽的描述。当这些被依赖的对象不存在十,该触发器就会变成INVALID,但是它的定义仍保留在目录中。要重新激活此触发器,必须从目录中检索它的定义并提交新的 CREATE TRIGGER 语句。
 
在DB2中。即使删除触发器依赖的基表,trigger的描述信息也不会从系统目录(数据字典)中删除,必须手工删除该trigger
若删除触发器,则它的描述会从 SYSCATTRIGGERS 目录视图中被删除,且它所有的依赖性也从 SYSCATTRIGDEP 目录视图中被删除。所有与该触发器有 UPDATE、INSERT 或 DELETE 关系的程序包都会被停用。
与触发器相关的数据字典
 
在DB2中,通过sysibmsystriggers数据字典可以查看数据库中定义的触发器的详细信息。也可以通过如下2个视图看到与trigger有关的信息
 
SELECT FROM SYSCATTRIGDEP; --记录触发器与某个其他对象的所有依赖性。
SELECT FROM SYSCATTRIGGERS; --记录触发器描述的目录视图
 
比如:
SQL> update command options using x ON@
DB20000I UPDATE COMMAND OPTIONS命令成功完成。
SQL> SELECT TEXT FROM SYSIBMSYSTRIGGERS where SCHEMA='ZHANGRP' and NAME='TRIG_EMP_DEL'@ --查看trigger的定义语句
create trigger trig_emp_del
BEFORE DELETE ON emp
REFERENCING OLD AS o
FOR EACH ROW MODE DB2SQL
WHEN (ostatus='1')
SIGNAL SQLSTATE '90001' ('Cannot Delete an Active Record')
SQL>
附件:送上一个Instead of Trigger的测试DEMO
可使用 INSTEAD OF 触发器来代表本质上不是可更新的视图执行删除、插入或更新请求。利用此类型触发器的应用程序能够对视图写入更新 *** 作,就好像视图是表一样。下面是一个简单的DEMO
SQL> select from dept@ --存放部门基本信息的表
DEPTNO DEPTNAME
----------- --------
10 dept_a
20 dept_b
30 dept_c
40 dept_d
4 条记录已选择。
SQL> select from emp@ --存放员工信息的表
EMPNO EMPNAME DEPTNO
----------- -------- -----------
100 Mrzhang 10
101 MrLi 20
102 MrHu 30
3 条记录已选择。
SQL> create view v_emp(empno,empname,deptname) as --创建一个视图,将员工信息和部门信息统一起来
SQL> select eempno,eempname,ddeptname from dept d, emp e where edeptno=ddeptno@
DB20000I SQL命令成功完成。
SQL> select from v_emp@ --通过该视图v_emp可以较清楚的看到员工的基本信息
EMPNO EMPNAME DEPTNAME
----------- -------- --------
100 Mrzhang dept_a
101 MrLi dept_b
102 MrHu dept_c
3 条记录已选择。
SQL>
--创建一个针对视图v_emp的 instead of的触发器,通过该视图的DML *** 作可以直接维护员工信息表
SQL> create trigger trig_v_emp_insert INSTEAD OF INSERT ON v_emp
SQL> REFERENCING NEW AS n
SQL> FOR EACH ROW MODE DB2SQL
SQL> BEGIN ATOMIC
SQL> declare dept_no integer;
SQL> set dept_no=(select deptno from dept where deptname=ndeptname);
SQL> if dept_no is null then
SQL> SIGNAL SQLSTATE '90000' ('Department id Does not Exist');
SQL> else
SQL> insert into emp values(nempno,nempname,dept_no);
SQL> end if;
SQL> END
SQL> @
DB20000I SQL命令成功完成。
SQL>
SQL> insert into v_emp values(103,'MsWang','dept_c')@
DB20000I SQL命令成功完成。
SQL> select from v_emp@
EMPNO EMPNAME DEPTNAME
----------- -------- --------
100 Mrzhang dept_a
101 MrLi dept_b
102 MrHu dept_c
103 MsWang dept_c
4 条记录已选择。
SQL> select from emp@
EMPNO EMPNAME DEPTNO
----------- -------- -----------
100 Mrzhang 10
101 MrLi 20
102 MrHu 30
103 MsWang 30
4 条记录已选择。
SQL> insert into v_emp values(103,'MsWang','dept_e')@
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在SQL 处理期间,它返回:
SQL0438N 应用程序发生错误,其诊断文本为:"Department id Does not Exist"。
SQLSTATE=90000
SQL>

关联的表,那要看你有没有将这个表与其他表建立关联关系了,比如说外键什么的,不然怎么判断是否是关联的表?如果关联字段名称相同的话,你也可以到数据字典中去查找。
db2没用过,如果是Oracle,

user_tables,user_tab_columns等表中
,如果是mysql,在information_schema数据库中tables、columns表中
不过的找一家手表的性价比较高,服务较好的厂家。巧了,我这有家手表厂家,
美橙表业。

1、创建主键表,test_class,并建立class_id字段为主键;

create table test_class(class_id number, class_name varchar2(20));

-- Create/Recreate indexes

alter table TEST_CLASS

add constraint P_CLASS_ID primary key (CLASS_ID)

using index

tablespace USERS

pctfree 10

initrans 2

maxtrans 255;

2、创建外键表,test_stu,其中字段class_id为test_class表的class_id字段;

create table test_stu(id number, class_id number);

-- Create/Recreate primary, unique and foreign key constraints

alter table TEST_STU

add constraint f_class_id foreign key (CLASS_ID)

references test_class (CLASS_ID) on delete cascade;

3、两张表分别插入记录;

insert into TEST_CLASS values(1001,'语文');

insert into TEST_CLASS values(1002,'数学');

insert into TEST_CLASS values(1003,'英语');

insert into TEST_STU values(1,1001);

insert into TEST_STU values(2,1001);

insert into TEST_STU values(3,1002);

insert into TEST_STU values(4,1003);

4、查询TEST_STU表中的记录;select t, rowid from test_stu;

5、删除主表TEST_CLASS中class_id=1001的记录,会发现从表TEST_STU中class_id中的记录也被删除;

delete test_class where class_id = 1001;

commit;

select t, trowid from TEST_STU t

Oracle、DB2、SQL Server 都支持。
MySQL 触发器不支持 。
-- 创建测试主表 ID 是主键
CREATE TABLE test_main (
id INT NOT NULL,
value VARCHAR(10),
PRIMARY KEY(id)
);
-- 创建测试子表
CREATE TABLE test_sub (
id INT NOT NULL,
main_id INT ,
value VARCHAR(10),
PRIMARY KEY(id)
);
-- 插入测试主表数据
INSERT INTO test_main(id, value) VALUES (1, 'ONE');
INSERT INTO test_main(id, value) VALUES (2, 'TWO');
-- 插入测试子表数据
INSERT INTO test_sub(id, main_id, value) VALUES (1, 1, 'ONEONE');
INSERT INTO test_sub(id, main_id, value) VALUES (2, 2, 'TWOTWO');
Oracle
-- 创建外键(使用 ON DELETE CASCADE 选项,删除主表的时候,同时删除子表)
ALTER TABLE test_sub
ADD CONSTRAINT main_id_cons
FOREIGN KEY (main_id) REFERENCES test_main ON DELETE CASCADE;
CREATE OR REPLACE TRIGGER BeforeDeleteTest_sub
BEFORE DELETE ON test_sub
FOR EACH ROW
BEGIN
dbms_outputput_line('BEFORE DELETE test_sub');
dbms_outputput_line('Old value = ' || :oldvalue );
END;
/
SQL> set serveroutput on
SQL> -- 测试删除主表数据 将成功地执行
SQL> DELETE
2 TEST_MAIN
3 WHERE
4 ID = 1;
BEFORE DELETE test_sub
Old value = ONEONE
已删除 1 行。
SQL>
SQL> -- 测试检索子表,应该只有一条 main_id = 2 的数据
SQL> SELECT
2
3 FROM
4 test_sub;
ID MAIN_ID VALUE
---------- ---------- --------------------
2 2 TWOTWO
DB2
-- 日志信息表
CREATE TABLE log_table ( log_data varchar(50));
-- 触发器
CREATE TRIGGER AfterDeleteTest_sub
AFTER DELETE ON test_sub
REFERENCING OLD AS O
FOR EACH ROW
BEGIN
INSERT INTO log_table VALUES ( 'Delete value = ' || Ovalue );
END
@
-- 外键约束
ALTER TABLE test_sub
ADD CONSTRAINT main_id_cons
FOREIGN KEY (main_id)
REFERENCES test_main ON DELETE CASCADE;
-- 测试删除主表数据 将成功地执行
DELETE
TEST_MAIN
WHERE
ID = 1;
-- 检查日志信息表,看看触发器是否被触发
db2 => SELECT FROM log_table;
LOG_DATA
--------------------------------------------------
Delete value = ONEONE
1 条记录已选择。
-- 测试检索子表,应该只有一条 main_id = 2 的数据
db2 => SELECT FROM test_sub;
ID MAIN_ID VALUE
----------- ----------- ----------
2 2 TWOTWO
1 条记录已选择。
SQL Server
-- 触发器
CREATE TRIGGER AfterDeleteTest_sub
ON Test_sub
FOR DELETE
AS
DECLARE
@OldValue VARCHAR(10);
BEGIN
PRINT('AFTER DELETE');
SELECT @OldValue = value FROM deleted;
PRINT('Old Value = ' + @OldValue);
END;
go
-- 创建外键(使用 ON DELETE CASCADE 选项,删除主表的时候,同时删除子表)
ALTER TABLE test_sub
ADD CONSTRAINT main_id_cons
FOREIGN KEY (main_id) REFERENCES test_main ON DELETE CASCADE;
GO
-- 测试删除主表数据 将成功地执行
1> DELETE TEST_MAIN WHERE ID = 1;
2> GO
AFTER DELETE
Old Value = ONEONE
(1 行受影响)
-- 测试检索子表,应该只有一条 main_id = 2 的数据
SELECT

FROM
test_sub;
go
(1 行受影响)
id main_id value
----------- ----------- ----------
2 2 TWOTWO
(1 行受影响)
MySQL
-- 日志信息表
CREATE TABLE log_table ( log_data varchar(50));
-- 触发器
DELIMITER //
CREATE TRIGGER BeforeDeleteTest_sub
BEFORE DELETE ON Test_sub
FOR EACH ROW
BEGIN
INSERT INTO log_table VALUES ( CONCAT('Delete Value = ', oldValue) );
END;
//
DELIMITER ;
-- 外键
ALTER TABLE test_sub ADD CONSTRAINT fk_main_id_cons
FOREIGN KEY (main_id) REFERENCES test_main(id)
ON DELETE CASCADE;
-- 删除
DELETE FROM test_main WHERE id = 1;
-- 检查日志信息表,看看触发器是否被触发
mysql> SELECT FROM log_table;
Empty set (000 sec)
MySQL 外键级联删除, 不会触发 子表的触发器
-- 测试检索子表,应该只有一条 main_id = 2 的数据
mysql> SELECT FROM test_sub;
+----+---------+--------+
| id | main_id | value |
+----+---------+--------+
| 2 | 2 | TWOTWO |
+----+---------+--------+
1 row in set (000 sec)
>楼主一定是在哪个教程上抄的代码吧,呵呵
CREATE OR REPLACE这个意思是让你二选一,不要两个都弄上来嘛。
要么 CREATE 要么REPLACE
例如
CREATE Function GetNextValue(sCHNLID IN CHAR, sCHNLGOODSID IN CHAR)


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13365949.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-22
下一篇 2023-07-22

发表评论

登录后才能评论

评论列表(0条)

保存