请写出对销售表创建下列两个触发器的T-SQL语句:①对销售表插入销售记录时,能触发该触发器,使得图书表中的库存量相应减少。②对销售表删除销售记录时,能触发该触发器,使得图书表中的库存量相应增加。
时间: 2024-05-07 13:20:36 浏览: 64
触发器1:对销售表插入销售记录时,减少图书表中库存量
```sql
CREATE TRIGGER trigger_sale_insert ON sales
AFTER INSERT
AS
BEGIN
UPDATE books
SET stock = stock - inserted.quantity
FROM books
INNER JOIN inserted ON books.book_id = inserted.book_id
END
```
触发器2:对销售表删除销售记录时,增加图书表中库存量
```sql
CREATE TRIGGER trigger_sale_delete ON sales
AFTER DELETE
AS
BEGIN
UPDATE books
SET stock = stock + deleted.quantity
FROM books
INNER JOIN deleted ON books.book_id = deleted.book_id
END
```
相关问题
针对图书管理系统 book 数据库: 使用 SSMS 和 TSQL 语句创建 DML 触发器, (1) 对图书管理系统 book 数据库,当插入一条书籍记录时,打印出 一条语句表示已经成功插入一条数据“您又添加了一本书” (2) 对表 books 再创建一个 after insert 触发器,当插入一条书籍记 录时,打印出一条语句表示已经成功插入一条数据“您再次添加 了一本书” (3) 使用 T-SQL 语句创建触发器,当向 borrowinfo 借阅信息表中插入 数据时,更新 BorrowNum 表中的数值,让 BorrowNum 中数据值与 borrowinfo 表中每个读者借阅书籍的数量对应 2. 实验对同一个表,两个 DML 触发器以不同顺序触发效果 3. 使用 SSMS 查看和修改 DML 触发器 4. 使用存储过程(两种语句)查看 DML 触发器 5. 使用 SSMS 和 TSQL 语句禁用、启用、删除 DML 触发器 6. 使 用 TSQL 语 句 创 建 针 对 CREATE_DATABASE , ALTER_DATABASE,DROP_DATABASE 的 DDL 触发器
1. 创建触发器:
```
--1.
CREATE TRIGGER tr_insert_book ON books
AFTER INSERT
AS
BEGIN
PRINT '您又添加了一本书'
END
--2.
CREATE TRIGGER tr_insert_book2 ON books
AFTER INSERT
AS
BEGIN
PRINT '您再次添加了一本书'
END
--3.
CREATE TRIGGER tr_update_borrow_num ON borrowinfo
AFTER INSERT
AS
BEGIN
UPDATE BorrowNum
SET num = (SELECT COUNT(*) FROM borrowinfo WHERE reader_id = inserted.reader_id)
WHERE reader_id = inserted.reader_id
END
```
2. 触发器顺序:
```
CREATE TRIGGER tr_insert_book ON books
AFTER INSERT
AS
BEGIN
PRINT '触发器1'
ROLLBACK
END
CREATE TRIGGER tr_insert_book2 ON books
AFTER INSERT
AS
BEGIN
PRINT '触发器2'
END
INSERT INTO books (book_id, book_name, author, publish_date, price) VALUES (1, 'book1', 'author1', '2021-10-01', 10)
```
结果为:触发器2,触发器1
3. 查看和修改触发器:
在 SSMS 中,可以在数据库的“触发器”文件夹下找到已创建的触发器,右键点击触发器选择“脚本触发器”可以查看和修改触发器。
4. 使用存储过程查看触发器:
```
--1. 查看所有触发器
EXEC sp_helptrigger 'books'
--2. 查看指定触发器
SELECT OBJECT_NAME(parent_object_id) AS table_name, name AS trigger_name, OBJECT_DEFINITION(OBJECT_ID) AS definition
FROM sys.triggers
WHERE parent_class_desc = 'OBJECT_OR_COLUMN' AND OBJECT_NAME(parent_object_id) = 'books' AND name = 'tr_insert_book'
```
5. 启用、禁用和删除触发器:
```
--禁用触发器
DISABLE TRIGGER tr_insert_book ON books
--启用触发器
ENABLE TRIGGER tr_insert_book ON books
--删除触发器
DROP TRIGGER tr_insert_book ON books
```
6. 创建 DDL 触发器:
```
--创建数据库后触发器
CREATE TRIGGER tr_create_db ON ALL SERVER
FOR CREATE_DATABASE
AS
BEGIN
PRINT '数据库已创建'
END
--修改数据库后触发器
CREATE TRIGGER tr_alter_db ON ALL SERVER
FOR ALTER_DATABASE
AS
BEGIN
PRINT '数据库已修改'
END
--删除数据库后触发器
CREATE TRIGGER tr_drop_db ON ALL SERVER
FOR DROP_DATABASE
AS
BEGIN
PRINT '数据库已删除'
END
```
为Reports表创建一触发器,并给出正反实例的SQL语句:当插入一条记录或修改成绩时,若记录不为空,则须确保此记录的成绩在0~100分之间(分别写出正反例的SQL语句,并与运行结果同屏截图,截图中写入学号后两位)
好的,针对你的问题,我可以为你提供以下 SQL 语句:
1. 创建一个触发器,确保插入或修改的记录成绩在0~100分之间:
```
CREATE TRIGGER trg_Reports_CheckGrade
BEFORE INSERT OR UPDATE ON Reports
FOR EACH ROW
BEGIN
IF NEW.Grade < 0 OR NEW.Grade > 100 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '成绩必须在0~100之间!';
END IF;
END;
```
这个触发器会在每次往Reports表中插入新数据或更新数据时触发,如果插入或更新的记录成绩不在0~100分之间,会抛出一个异常。注意,这个触发器是在插入或更新操作之前触发的(BEFORE),如果你想要在操作之后触发,需要将CREATE TRIGGER语句中的BEFORE改为AFTER。
2. 正反例的SQL语句和运行结果如下:
正例:
```
-- 插入一条成绩为90的记录
INSERT INTO Reports(SID, CID, Grade) VALUES('20200101', 'C001', 90);
```
运行结果:
![正例运行结果](https://img-blog.csdnimg.cn/20210621140828900.png#pic_center)
反例:
```
-- 插入一条成绩为110的记录
INSERT INTO Reports(SID, CID, Grade) VALUES('20200102', 'C002', 110);
```
运行结果:
![反例运行结果](https://img-blog.csdnimg.cn/20210621140842256.png#pic_center)
在反例中,我们插入了一条成绩为110的记录,违反了触发器中设置的成绩必须在0~100之间的限制,因此触发器抛出了一个异常。
阅读全文