早教吧作业答案频道 -->其他-->
数据库触发器问题1、在score表上创建一个insteadofupdate触发器,实现:当从表score更新记录时检查当前用户是否是dbo,如果不是dbo就不允许进行更新操作,否则允许。2、给sell表创建一个afteri
题目详情
数据库触发器问题
1、在score表上创建一个instead of update触发器,实现:当从表score更新记录时检查当前用户是否是dbo,如果不是dbo就不允许进行更新操作,否则允许。
2、给sell表创建一个after insert 触发器,实现:当向sell插入一条记录时,修改stock表stock_amount(库存数量),值等于stock_amount-sell_amount,还有修改时间modified_date,并显示相应的提示信息:“库存量还剩余stock_amount-sell_amount”,当(stock_amount-sell_amount)<0时,不允许进行插入操作,即操作回滚,并显示相应的提示信息:“库存量不足,只有stock_amount”。
1、在score表上创建一个instead of update触发器,实现:当从表score更新记录时检查当前用户是否是dbo,如果不是dbo就不允许进行更新操作,否则允许。
2、给sell表创建一个after insert 触发器,实现:当向sell插入一条记录时,修改stock表stock_amount(库存数量),值等于stock_amount-sell_amount,还有修改时间modified_date,并显示相应的提示信息:“库存量还剩余stock_amount-sell_amount”,当(stock_amount-sell_amount)<0时,不允许进行插入操作,即操作回滚,并显示相应的提示信息:“库存量不足,只有stock_amount”。
▼优质解答
答案和解析
CREATE TABLE score (
id INT PRIMARY KEY,
val VARCHAR(10)
);
CREATE TRIGGER tr_Update_score
ON score
instead of update
AS
BEGIN
IF USER_NAME() = 'dbo'
UPDATE
score
SET
score.val = inserted.val
FROM
score JOIN inserted
ON (score.id = inserted.id)
ELSE
PRINT '你不是 DBO!';
END;
insert into score VALUES(1, 'A');
-- 使用 Demo 作为用户名,登录到数据库。
E:\>sqlcmd -S "localhost\SQLEXPRESS" -U Demo -P demo
1> use testwork
2> go
已将数据库上下文更改为 'TestWork'。
1> UPDATE score SET val='B' WHERE id = 1;
2> go
(1 行受影响)
你不是 DBO!
1> select * FROM score;
2> go
id val
----------- ----------
1 A
(1 行受影响)
-- 使用操作系统验证,登录到数据库。
E:\>sqlcmd -S "localhost\SQLEXPRESS"
1> use testwork
2> go
已将数据库上下文更改为 'TestWork'。
1> UPDATE score SET val='B' WHERE id = 1;
2> go
(1 行受影响)
1> select * FROM score;
2> go
id val
----------- ----------
1 B
(1 行受影响)
======================
--货物表
CREATE TABLE stock(
id INT,
stock_amount INT
);
--订单表
CREATE TABLE sell(
ID INT,
GoodsID INT,
sell_amount INT
);
-- 库存测试数据:
INSERT INTO stock VALUES (1, 100);
create trigger trgAfterSell
on sell
after insert
as
begin
declare
@cGoodsID as int,
@sell_amount as int,
@nowCount as INT
select @cGoodsID = GoodsID, @sell_amount = sell_amount
from inserted
SELECT @nowCount = stock_amount
FROM stock
where ID = @cGoodsID;
IF @nowCount - @sell_amount < 0
BEGIN
PRINT '库存量不足,只有 ' + CAST(@nowCount AS varchar);
ROLLBACK;
END
ELSE
BEGIN
update stock
set stock_amount = stock_amount - @sell_amount
where ID = @cGoodsID
PRINT '库存量还剩余' + CAST ((@nowCount - @sell_amount) AS varchar);
END
end
1> INSERT INTO sell VALUES(1, 1, 90);
2> go
(1 行受影响)
库存量还剩余10
1> INSERT INTO sell VALUES(1, 1, 20);
2> go
库存量不足,只有 10
消息 3609,级别 16,状态 1,服务器 HOME-BED592453C\SQLEXPRESS,第 1 行
事务在触发器中结束。批处理已中止。
1> select * from sell;
2> select * from stock;
3> go
ID GoodsID sell_amount
----------- ----------- -----------
1 1 90
(1 行受影响)
id stock_amount
----------- ------------
1 10
(1 行受影响)
id INT PRIMARY KEY,
val VARCHAR(10)
);
CREATE TRIGGER tr_Update_score
ON score
instead of update
AS
BEGIN
IF USER_NAME() = 'dbo'
UPDATE
score
SET
score.val = inserted.val
FROM
score JOIN inserted
ON (score.id = inserted.id)
ELSE
PRINT '你不是 DBO!';
END;
insert into score VALUES(1, 'A');
-- 使用 Demo 作为用户名,登录到数据库。
E:\>sqlcmd -S "localhost\SQLEXPRESS" -U Demo -P demo
1> use testwork
2> go
已将数据库上下文更改为 'TestWork'。
1> UPDATE score SET val='B' WHERE id = 1;
2> go
(1 行受影响)
你不是 DBO!
1> select * FROM score;
2> go
id val
----------- ----------
1 A
(1 行受影响)
-- 使用操作系统验证,登录到数据库。
E:\>sqlcmd -S "localhost\SQLEXPRESS"
1> use testwork
2> go
已将数据库上下文更改为 'TestWork'。
1> UPDATE score SET val='B' WHERE id = 1;
2> go
(1 行受影响)
1> select * FROM score;
2> go
id val
----------- ----------
1 B
(1 行受影响)
======================
--货物表
CREATE TABLE stock(
id INT,
stock_amount INT
);
--订单表
CREATE TABLE sell(
ID INT,
GoodsID INT,
sell_amount INT
);
-- 库存测试数据:
INSERT INTO stock VALUES (1, 100);
create trigger trgAfterSell
on sell
after insert
as
begin
declare
@cGoodsID as int,
@sell_amount as int,
@nowCount as INT
select @cGoodsID = GoodsID, @sell_amount = sell_amount
from inserted
SELECT @nowCount = stock_amount
FROM stock
where ID = @cGoodsID;
IF @nowCount - @sell_amount < 0
BEGIN
PRINT '库存量不足,只有 ' + CAST(@nowCount AS varchar);
ROLLBACK;
END
ELSE
BEGIN
update stock
set stock_amount = stock_amount - @sell_amount
where ID = @cGoodsID
PRINT '库存量还剩余' + CAST ((@nowCount - @sell_amount) AS varchar);
END
end
1> INSERT INTO sell VALUES(1, 1, 90);
2> go
(1 行受影响)
库存量还剩余10
1> INSERT INTO sell VALUES(1, 1, 20);
2> go
库存量不足,只有 10
消息 3609,级别 16,状态 1,服务器 HOME-BED592453C\SQLEXPRESS,第 1 行
事务在触发器中结束。批处理已中止。
1> select * from sell;
2> select * from stock;
3> go
ID GoodsID sell_amount
----------- ----------- -----------
1 1 90
(1 行受影响)
id stock_amount
----------- ------------
1 10
(1 行受影响)
看了 数据库触发器问题1、在sco...的网友还看了以下:
当改变两个或两个以上条件是平衡如何移动.恒T,P容器,2NO2==N2O4,加入N2O4,平衡如何 2020-04-27 …
学校体育器材室有排球、足球若干个,活动课上将排球借出1/4后,还剩排球30个将足球的1/3借出后所 2020-06-03 …
如何理解“采铜于山铸新器,学心知智启世人”这句话? 2020-06-22 …
明治维新改革不彻底,保留下大量封建残余,其根本原因是[]A.明治维新的领导权掌握在武士出身的大久保 2020-07-10 …
生物怎么进化出新器官?比如爬行类的翅膀,为什么人就不能在身上进化出更有利于生长的器官呢? 2020-07-25 …
生物进化新器官最短需要多久?如题. 2020-11-04 …
阅读理解。一天,小老鼠外出寻找食物,不小心中(zhōngzhòng)了机关,被关进了捕(bǔpǔ)鼠 2020-11-10 …
某校新买了30箱总质量为300kg的实验器材,当实验员小王把这批器材搬往14m高的实验室中时,他对器 2020-12-15 …
处于()的基带不允许新的呼叫接入但正在进行的呼叫仍能继续。拜托各位了3Q处于()的基带不允许新的呼叫 2020-12-27 …
英语翻译当前不允许新用户注册,详细信息请与请与系统管理员联系. 2021-01-21 …