ms sql server2000 触发器能否事先实时检查新添加记录的功能?

我用mssqlserver2000保存网站数据,我担心黑客会给数据库写入一些恶意代码【例如<%request...%>】,所以我想:能不能在存入数据表后,马上调用触发器检... 我用ms sql server2000 保存网站数据,我担心黑客会给数据库写入一些恶意代码【例如 <% request...%>】 ,所以我想:能不能在存入数据表后,马上调用触发器检查新添加的记录字段中是否含有恶意的字符串脚本?如果含有 恶意的script、request 等脚本,就立即删除 这条记录!这样,我的数据库就安全多了;请问触发器能否实现检查记录字段内容的功能?
另外,触发器能否调用一个 windows 程序?进一步的想法是:如果发现了恶意记录,删除记录后,最好能调用一个 程序,发出一条Email来通知管理员,这样就很完美了。请问触发器能否调用 windows 程序?
展开
 我来答
匿名用户
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 有没有问题。

szm341
2014-01-12 · TA获得超过6726个赞
知道大有可为答主
回答量:5005
采纳率:100%
帮助的人:5153万
展开全部
触发器分为事前触发与事后触发,只要用事前instead of触发器判断就可以了
但是跟你说的稍有不同,触发器是用来防止插入的,而不是用来检验删除的
还有,你可以利用check约束、还有程序的前台限制关键字,不一定要通过触发器
另外,通过sqlserver去调用应用程序是很危险的,如果是用不当,会被侵入对操作系统进行破坏,可以通过xp_cmdshell扩展存储过程调用win程序
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
哎呀……18a91a6
2014-01-12 · TA获得超过4.2万个赞
知道大有可为答主
回答量:7246
采纳率:76%
帮助的人:3028万
展开全部
1、触发器可以用来做类似的功能,触发器针对表的记录的添加操作进行即可。
2、SQL2000不能调用win程序,只能调用针对性设计的.DLL库。
3、如果你想“调用一个 程序,发出一条Email来通知管理员”,可以做一个程序,每隔几秒一次与数据库通信,查看数据库表情况,如有必要时由这个定时程序进行其它操作。
追问
可以做一个程序,每隔几秒一次与数据库通信,查看数据库表情况。。。。。。。
---------------------------------------------------------------------------------------
这个办法不太好,会加重数据库负担,那么设计样的dll库呢?c#的framework 库行吗?
有例子吗?或资料链接
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式