1 利用课本上介绍的几种方法对数据库的完整性进行定义和检验,掌握Constraint,Check等短句的用法;
2 在SQL Server或者MySQL中练习触发器的使用;
a) 在northwind数据库中建立2个表,cust和order,表定义如下:
表cust
列名 类型及长度 其它
CustomerID char(5) 主键
Custcity Char(24)
Custname Char(64) 非空
CStatus int 客户状态
Cstorage int 库存量
Cdate Date 日期
表order:
列名 类型及长度 其它
Orderid char(5) 主键
OrderNames Char(24) 非空
OStatus int 状态
Orders int 定购量
Odate Date 日期
b) 要求根据以上表完成以下作业:
① 在cust表中建立删除触发器,实现上述2表的级联删除。
② 在order表建立insert触发器,当向order表插入一行,如果cust表中对应记录status值为1,说明处于准备状态不能写入该数据;
③ 在order表上建立一个插入触发器,在添加一个订单时,减少cust表的相应货物的记录的库存量。
④ 在order表上建立一个插入触发器,规定订单日期(Odate)不能手工修改。
⑤ 要求订购的物品一定要在仓库中有的,并且数量足够。
⑥ 在order表上建立一个插入触发器,同时插入多行数据时,要求订购的物品一定要在仓库中有的。
⑦ 查看触发器情况:
1 sp_helptrigger 触发器名
2 sp_helptext 触发器名
3 设置某一触发器的无效和重新有效
4 删除触发器 YES
这个完全没有必要去创建触发器啊。
直接外键设置成 DELETE CASCADE 方式 的就可以了, 一行触发器的代码也不用写。
下面是具体的对比例子:
-- 创建测试主表 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');
上面是 测试表+测试数据
下面是 默认外键约束方式的例子
1> ALTER TABLE test_sub ADD CONSTRAINT main_id_cons FOREIGN KEY (main_id) REFERENCES test_main;2> go
1> DELETE
2> test_main
3> WHERE
4> ID = 1;
5> go
消息 547,级别 16,状态 1,服务器 HOME-BED592453C\SQLEXPRESS,第 1 行
DELETE 语句与 REFERENCE 约束"main_id_cons"冲突。该冲突发生于数据库"Stock",表"db
otest_sub", column 'main_id'。
语句已终止。
看看, 提示的错误信息, 和你的错误信息, 格式上是一样的。
下面是使用 DELETE CASCADE 方式 的外键约束的例子
(需要删除掉前面创建的那个外键约束)
1> -- 创建外键(使用 ON DELETE CASCADE 选项,删除主表的时候,同时删除子表)
2> ALTER TABLE test_sub
3> ADD CONSTRAINT main_id_cons
4> FOREIGN KEY (main_id) REFERENCES test_main ON DELETE CASCADE;
5>
6> -- 测试删除主表数据 将成功地执行
7> DELETE
8> TEST_MAIN
9> WHERE
10> ID = 1;
11>
12> -- 测试检索子表,应该只有一条 main_id = 2 的数据
13> SELECT
14>
15> FROM
16> test_sub;
17>
18> go
(1 行受影响)
id main_id value
----------- ----------- ----------
2 2 TWOTWO
(1 行受影响)
1)查看表中的触发器类型:
sp_helptrigger:返回对当前数据库的指定表定义的 DML 触发器的类型。sp_helptrigger 不能用于 DDL 触发器。
示例: EXEC sp_helptrigger '表名'
2)查看触发器的有关信息:
sp_help:报告有关数据库对象(syssysobjects 兼容视图中列出的所有对象)、用户定义数据类型或某种数据类型的信息。
示例: EXEC sp_help '触发器名'
3)显示触发器的定义:
sp_helptext:显示规则、默认值、未加密的存储过程、用户定义函数、触发器或视图的文本。
示例: EXEC sp_helptext '触发器名'
4)查看当前库中所有的触发器:
查询脚本:SELECT FROM Sysobjects WHERE xtype = 'TR'
5)查看当前库中所有的触发器和与之相对应的表:
查询脚本:SELECT tb2name AS tableName,tb1name AS triggerName FROM Sysobjects tb1 JOIN Sysobjects tb2 ON tb1parent_obj=tb2id WHERE tb1type='TR'
以上就是关于关于数据库触发器的问题全部的内容,包括:关于数据库触发器的问题、sql数据库触发器求指导、如何查看SQL数据库中所有的触发等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)