ms sql server2000 触发器能否事先实时检查新添加记录的功能?
我用mssqlserver2000保存网站数据,我担心黑客会给数据库写入一些恶意代码【例如<%request...%>】,所以我想:能不能在存入数据表后,马上调用触发器检...
我用ms sql server2000 保存网站数据,我担心黑客会给数据库写入一些恶意代码【例如 <% request...%>】 ,所以我想:能不能在存入数据表后,马上调用触发器检查新添加的记录字段中是否含有恶意的字符串脚本?如果含有 恶意的script、request 等脚本,就立即删除 这条记录!这样,我的数据库就安全多了;请问触发器能否实现检查记录字段内容的功能?
另外,触发器能否调用一个 windows 程序?进一步的想法是:如果发现了恶意记录,删除记录后,最好能调用一个 程序,发出一条Email来通知管理员,这样就很完美了。请问触发器能否调用 windows 程序? 展开
另外,触发器能否调用一个 windows 程序?进一步的想法是:如果发现了恶意记录,删除记录后,最好能调用一个 程序,发出一条Email来通知管理员,这样就很完美了。请问触发器能否调用 windows 程序? 展开
3个回答
2014-01-13
展开全部
触发器就是 当检测到 数据异常的时候, 回滚这个操作, 而不是 数据插入之后, 再删除的处理。
先给你看一个触发器的例子:
-- 货物表
CREATE TABLE Goods(
id INT,
Amount INT
);
-- 订单表
CREATE TABLE OrderDetail(
ID INT,
GoodsID INT,
Amount INT
);
-- 库存测试数据:
INSERT INTO Goods VALUES (1, 100);
要求:当订单表插入数据的时候,自动去货物表检查,是否有足够的库存
如果有,那么更新 货物表 的 库存 = 原库存 – 本次订单数量
如果库存不足,报错返回.
EXEC sp_addmessage 60005, 16,
@msgtext = N'Not Goods to use.',
@lang = 'us_english'
go
EXEC sp_addmessage 60005, 16,
@msgtext = N'库存不足',
@lang = '简体中文'
go
create trigger trgAfterOrder
on OrderDetail
for insert
as
begin
declare
@cGoodsID as int,
@iAmount as int,
@nowCount as INT
select @cGoodsID = GoodsID, @iAmount = Amount
from inserted
SELECT @nowCount = Amount
FROM Goods
where ID = @cGoodsID;
IF @nowCount - @iAmount < 0
BEGIN
RAISERROR(60005, 16, 1);
ROLLBACK;
END
ELSE
BEGIN
update Goods
set Amount = Amount - @iAmount
where ID = @cGoodsID
END
end
处理前
1> select * from goods;
2> go
id Amount
----------- -----------
1 100
(1 行受影响)
1> select * from OrderDetail;
2> go
ID GoodsID Amount
----------- ----------- -----------
(0 行受影响)
1> INSERT INTO OrderDetail VALUES(1, 1, 90);
2> go
(1 行受影响)
1> INSERT INTO OrderDetail VALUES(1, 1, 20);
2> go
消息 60005,级别 16,状态 1,服务器 HOME-BED592453C\SQLEXPRESS,过程 trgAfterOrd
er,第 21 行
库存不足
消息 3609,级别 16,状态 1,服务器 HOME-BED592453C\SQLEXPRESS,第 1 行
事务在触发器中结束。批处理已中止。
处理后
1> select * from goods;
2> go
id Amount
----------- -----------
1 10
(1 行受影响)
1> select * from OrderDetail;
2> go
ID GoodsID Amount
----------- ----------- -----------
1 1 90
(1 行受影响)
上面的例子, 当检测的数据异常的时候, 使用 RAISERROR 语句 与 ROLLBACK
抛出异常, 并回滚数据。
下面是 关于 Sql Server 调用 Windows 下面的程序的例子:
SQL Server默认关闭 master..xp_cmdshell 功能
1> EXEC master..xp_cmdshell
2> 'bcp [Test1].[dbo].[a] out "D:\Program Files\a.txt" -c -T -S "localhost\SQL
EXPRESS"'
3> go
消息 15281,级别 16,状态 1,服务器 HOME-BED592453C\SQLEXPRESS,过程 xp_cmdshell
,第 1 行
SQL Server 阻止了对组件 'xp_cmdshell' 的 过程'sys.xp_cmdshell' 的访问,因为此组
件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启
用 'xp_cmdshell'。有关启用 'xp_cmdshell' 的详细信息,请参阅 SQL Server 联机丛书
中的 "外围应用配置器"。
EXEC sp_configure 'show advanced options', 1
GO
-- 重新配置
RECONFIGURE
GO
-- 启用xp_cmdshell
EXEC sp_configure 'xp_cmdshell', 1
GO
--重新配置
RECONFIGURE
GO
EXEC master..xp_cmdshell
'bcp [Test1].[dbo].[a] out "D:\Program Files\a.txt" -c -T -S "localhost\SQLEXPRESS"'
GO
--用完后,要记得将xp_cmdshell禁用(从安全角度安全考虑)
-- 允许配置高级选项
EXEC sp_configure 'show advanced options', 1
GO
-- 重新配置
RECONFIGURE
GO
-- 禁用xp_cmdshell
EXEC sp_configure 'xp_cmdshell', 0
GO
--重新配置
RECONFIGURE
GO
上面的操作, 是 SQL Server 2005 下面测试通过的。
不知道 SQL 2000 有没有问题。
展开全部
触发器分为事前触发与事后触发,只要用事前instead of触发器判断就可以了
但是跟你说的稍有不同,触发器是用来防止插入的,而不是用来检验删除的
还有,你可以利用check约束、还有程序的前台限制关键字,不一定要通过触发器
另外,通过sqlserver去调用应用程序是很危险的,如果是用不当,会被侵入对操作系统进行破坏,可以通过xp_cmdshell扩展存储过程调用win程序
但是跟你说的稍有不同,触发器是用来防止插入的,而不是用来检验删除的
还有,你可以利用check约束、还有程序的前台限制关键字,不一定要通过触发器
另外,通过sqlserver去调用应用程序是很危险的,如果是用不当,会被侵入对操作系统进行破坏,可以通过xp_cmdshell扩展存储过程调用win程序
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1、触发器可以用来做类似的功能,触发器针对表的记录的添加操作进行即可。
2、SQL2000不能调用win程序,只能调用针对性设计的.DLL库。
3、如果你想“调用一个 程序,发出一条Email来通知管理员”,可以做一个程序,每隔几秒一次与数据库通信,查看数据库表情况,如有必要时由这个定时程序进行其它操作。
2、SQL2000不能调用win程序,只能调用针对性设计的.DLL库。
3、如果你想“调用一个 程序,发出一条Email来通知管理员”,可以做一个程序,每隔几秒一次与数据库通信,查看数据库表情况,如有必要时由这个定时程序进行其它操作。
追问
可以做一个程序,每隔几秒一次与数据库通信,查看数据库表情况。。。。。。。
---------------------------------------------------------------------------------------
这个办法不太好,会加重数据库负担,那么设计样的dll库呢?c#的framework 库行吗?
有例子吗?或资料链接
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询