怎样使用MSSQL 2000 的删除触发器建立删除日志。---过江项羽
在MS SQLServer 2000下建立一个删除的触发器,它能够获得发出删除命令客户机的 IP地址、主机名称、用户名称及服务器的当前日期、时间等。
技术上如果可能的话,最好能够获得客户机的CPU型号,硬盘ID号 型号和大小,内存大小, 客户机当前时间等信息。
望各位朋友们帮忙,谢谢了。
最好有代码,再另外加分酬谢。
问题点数:300、回复次数:19Top
1 楼Haiwer(海阔天空)回复于 2002-02-22 09:26:05 得分 0
客户机的主机名称、用户名称及服务器的当前日期、时间的获得不难,分别有函数,其他信息可能在触发器里实现比较难,在客户端实现应该不难。
Top
2 楼Haiwer(海阔天空)回复于 2002-02-22 09:35:00 得分 0
主机名称:HOST_NAME()
用户名称:SUSER_NAME()或SUSER_SNAME()
服务器的当前日期、时间:getdate()Top
3 楼TR@SOE()回复于 2002-02-22 09:39:30 得分 30
项羽兄,我只能表示关注。Top
4 楼Haiwer(海阔天空)回复于 2002-02-22 09:59:55 得分 150
一个触发器代码:
if exists (select * from sysobjects where id = object_id('dbo.Trigg_Test_Del') and sysstat & 0xf = 8)
drop trigger dbo.Trigg_Test_Del
GO
create trigger Trigg_Test_Del on Test
For Delete
AS
insert TestLogs
select Id, --被删除记录的Id
opTime=GetDate(), --删除日期时间
HostName=Host_Name(), --主机名称
AppName=App_Name(), --客户机使用的应用程序
UserName=sUser_Name() --用户名
from DELETED
GO
Top
5 楼zhuzhichao(竹之草)回复于 2002-02-22 10:07:56 得分 30
我想你是想达到审计模式的效果.
可以在MSSQL中不能像Oracle那样对SCHEMA做一个触发器以舰听所有的表的DDL或者DML语句的动作.
因此,如果你想监听客户机上的删除动作,只有对每个表做触发器这种笨方法.
无法用一个触发器办到.
至于客户机的 IP地址、主机名称、用户名称及服务器的当前日期、时间,则都是可以实现的.
客户机的CPU型号,硬盘ID号 型号和大小,内存大小, 客户机当前时间等信息也是有办法获得的.
Top
6 楼lluunn007(书生)回复于 2002-02-22 10:09:49 得分 30
哈哈~
亏你给我发那么多短信息。
我无能为力。帮你找找函数吧。Top
7 楼luhongjun(过江项羽)回复于 2002-02-22 19:48:39 得分 0
首先谢谢,Haiwer(海阔天空--回复语句只对MSSQL有效) 兄的回复。
Host_Name(), --主机名称
App_Name(), --客户机使用的应用程序
sUser_Name() --用户名
中只有在服务器上使用时,才能真正得到合法的值,如果在其他客户机上使用,则为空。
还有客户机的IP地址应该使用哪个函数,在SQL7.0中的24个系统函数中并没有获得客户机IP的函数,2000下是否有,没有应该以什么方式获得。
zhuzhichao(炎龙骑士团—索尔—破龙击)
可否详细的说一说,麻烦不怕,能解决问题就可以。
我现在可以把删除的记录用触发器保存到日志中,但客户端主机名,IP地址等信息无法获得,只有在服务器上进行删除时才可以扑捉。
Top
8 楼luhongjun(过江项羽)回复于 2002-02-22 19:57:05 得分 0
怎么看不到?Top
9 楼zhuzhichao(竹之草)回复于 2002-02-22 20:16:30 得分 0
luhongjun:
好的,等下周一來再說吧.
我雙休日不在.Top
10 楼luhongjun(过江项羽)回复于 2002-02-22 21:49:22 得分 0
如果客户端使用SQL Explorer进行删除,则
Host_Name(), --主机名称
App_Name(), --客户机使用的应用程序
sUser_Name() --用户名
产生空值(空格)
如果使用ADO进行删除,
Host_Name(), --主机名称
sUser_Name() --用户名
能够产生正确的结果
App_Name(), --客户机使用的应用程序
不能得到正确的结果
Top
11 楼Haiwer(海阔天空)回复于 2002-02-23 20:46:33 得分 0
今天在局域网里测试(用NAME PIPE),都能测到,包括用查询分析器删除的App_Name()。
是不是SQL Explorer有特别的设置?或者和NAME PIPE有关?
Top
12 楼luhongjun(过江项羽)回复于 2002-02-25 12:49:03 得分 0
怎样取得客户机的IP地址呢?
>zhudexiang(阿祥)
>在现有的SQL功能中要实现这些功能很难,你可以自己做一个扩展存储过程,在触发器中调用该过程来实现!
用扩展存储过程怎样实现?能否給个提示或給个例子?
在客户端的应用程序中获得IP地址,硬盘ID等我已经实现,但我现在想在触发器中实现这些信息,应该怎样做?
Top
13 楼luhongjun(过江项羽)回复于 2002-02-27 08:31:00 得分 0
在提一下,大家帮帮忙。
Top
14 楼luhongjun(过江项羽)回复于 2002-02-27 12:51:01 得分 0
还有我的应用程序用的是三层结构,使用Host_Name()得到的全是应用服务器的名字,我应该怎样得到发起客户端的机器名?
Top
15 楼mmzxg(超级笨蛋)回复于 2002-02-27 16:47:41 得分 30
学习学习,今天上班的时候正想着怎么处理这些问题呢?
学习,学习。。。。。。Top
16 楼mmzxg(超级笨蛋)回复于 2002-02-27 16:52:31 得分 0
是了,在EMTERPRISE中的LOGGER那里好象是有晒所有登录用户的资料的吧,包括用户网卡之类的东西,我想,是不是在这里入手呢。
小子菜鸟,不知所讲是否有用,请各位指教。。。。。Top
17 楼supsuccess(火气不小)回复于 2002-03-06 10:34:44 得分 0
先收...Top




