Triggers & stored procedures

--1、为ProductSales数据库中的产品表创建一个名为update_pno的UPDATE触发器,
--该触发器的作用是禁止更新产品表中的“ProductName”字段的内容。
--并用UPDATE语句修改产品表中第一条记录为:1	HP1500 打印机	2000
--要求显示“不能修改产品名称”的警告信息。

CREATE TRIGGER update_pno
ON Product
FOR UPDATE
AS
	IF UPDATE(ProductName)
	BEGIN
	PRINT '不能修改产品名称'
	ROLLBACK TRAN
	END
--测试触发器
UPDATE Product 
SET ProductID='1',ProductName='HP1500 打印机',Price='2000'
WHERE ProductID=(SELECT TOP 1 ProductID
				 FROM product)

--2、为factory数据库中的职工表创建一个名为update_name的UPDATE触发器,
--该触发器的作用是禁止更新职工表中的“姓名”字段的内容。
--并用UPDATE语句修改职工表中工号为‘2’的职工姓名为“陈晨”,
--要求显示“不能修改职工姓名”的警告信息。

ALTER TRIGGER update_name
ON Worker
FOR UPDATE
AS
	IF UPDATE (Wname)
	BEGIN 
	PRINT '不能修改职工姓名'
	ROLLBACK TRAN
	END

UPDATE Worker
SET Wname='陈晨' WHERE Wno='2'

UPDATE Worker
SET Wname='孙天奇' WHERE Wno='2'



--3、为MyQQ数据库编写一个带参数的存储过程proc_Star,
--它可以查询和某用户同一星座的用户的姓名和性别,并调用该存储过程验证其功能。
IF EXISTS(SELECT * FROM SYSOBJECTS WHERE name ='proc_star')
	DROP PROC proc_Star
CREATE PROCEDURE proc_Star
@star VARCHAR(50)
AS
	SELECT NickName 姓名,Sex 性别
	FROM Users
	WHERE Star IN (SELECT Star 
				FROM Users
				WHERE Star=@star)

EXEC proc_Star '双子座'


--4、创建一个带参数的存储过程proc_keshi:计算某教师授课总课时,
--并将值返回的存储过程以及执行代码。执行存储过程:计算“郭浩”的总课时。
IF EXISTS(SELECT * FROM SYSOBJECTS WHERE name ='proc_keshi')
	DROP PROC proc_keshi
CREATE PROCEDURE proc_keshi
@Tname nvarchar(50)
AS
	SELECT SUM(Cclass) 总课时
	FROM teach INNER JOIN teacher
	ON teach.Tno=teacher.Tno
	WHERE Tname=@Tname

EXEC proc_keshi '郭浩'



--5、teacher数据库的teacher表中创建一个INSERT 触发器T_insert,
--当向teacher表中插入数据时,要求学号必须以“1102”开头,否则取消插入操作,
--并提示错误“输入的教师工号错误,请确认后重新录入!”的警告信息。


ALTER TRIGGER T_insert
ON teacher 
FOR INSERT
AS
DECLARE @teacher_id char(8)

	IF LEFT(@teacher_id,4)!=1102
	BEGIN 
	PRINT '输入的教师工号错误,请确认后重新录入!'
	ROLLBACK TRAN
	END

INSERT INTO teacher
VALUES
('1102011','04','郭浩','3500','编译原理','33')

INSERT INTO teacher
VALUES
('1111111','04','郭浩','3500','编译原理','33')--一此题待修改!!!!
 
--6、为“学生选课数据库”数据库中的选课表创建一个名为update_fenshu的UPDATE触发器,
--该触发器的作用是禁止更新选课表中的“分数”字段的内容。
--并演示用UPDATE语句修改“选课”表中第一条记录为分数改为80
--如图:090101	100002	80
--要求显示“不能修改分数”的警告信息。

CREATE TRIGGER update_fenshu
ON xuanke
FOR UPDATE 
AS
	IF UPDATE(Result)
	BEGIN 
		PRINT '不能修改分数'
		ROLLBACK TRAN
	END 

UPDATE xuanke
SET Result='80' 
WHERE Sno=(SELECT TOP 1 Sno
		   FROM xuanke)
	  AND Cno=(SELECT TOP 1 Cno
		   FROM xuanke)

UPDATE xuanke
SET Result='78' 
WHERE Sno=(SELECT TOP 1 Sno
		   FROM xuanke)
AND Cno=(SELECT TOP 1 Cno
		   FROM xuanke)





--7、为jieyue数据库中的“借书记录” 
--表创建一个名为insert_jie的insert触发器,
--该触发器的作用是每当借书表插入一条记录,
--相应的“图书”表应该减少1本该书的库存数量。
--并用insert语句触发事件,截图相应结果。

CREATE TRIGGER insert_jie
ON borrow
FOR INSERT
AS
BEGIN
	UPDATE books
	SET num=num-1
	WHERE BID=(SELECT BID FROM INSERTED)
END

INSERT borrow
VALUES
('0003','bsn001','2020-5-11','2020-6-11')


CREATE TRIGGER insert_jie1
ON borrow
FOR INSERT
AS
DECLARE @bsn VARCHAR(50)
SELECT @bsn=BID
FROM INSERTED
PRINT @bsn
BEGIN
	UPDATE books
	SET num=num-1
	WHERE BID=@bsn
END

INSERT borrow
VALUES
('0003','bsn001','2020-5-11','2020-6-11')

--8、为jieyue数据库中的“还书记录” 
--表创建一个名为insert_huan的insert触发器,
--该触发器的作用是每当还书表插入一条记录,
--相应的“图书”表应该增加1本该书的库存数量。
--并用insert语句触发事件,截图相应结果。
CREATE TRIGGER insert_huan
ON [return]
FOR INSERT
AS
BEGIN
	UPDATE books
	SET num=num+1
	WHERE BID=(SELECT BID FROM INSERTED)
END

INSERT [return]
VALUES
('0003','bsn001','2020-6-10')

Guess you like

Origin blog.csdn.net/csdcainiao/article/details/106768766