关于数据库触发器的问题

关于数据库触发器的问题,第1张

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数据库中所有的触发等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/sjk/9324548.html

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

发表评论

登录后才能评论

评论列表(0条)

保存