关于HOST_NAME()的超级怪问题!请专家赐教!急
我写了一个触发器:
CREATE TRIGGER td_cw_tax ON [dbo].[cw_tax]
FOR DELETE
AS
INSERT INTO user_handle_history
(
handle_type,
table_code,
data_id,
data_name,
data_property,
workstation,
logon_name,
handle_date )
SELECT
'删除',
'cw_tax',
deleted.id,
deleted.name,
convert(varchar(50),deleted.result ),
HOST_NAME(),
system_user,
getdate()
FROM deleted ;
HOST_NAME(),就是得不到值!为什么?我把代码放在查询分析器就得到HOST_NAME()的值且能插入到此表,而且在触发器里所有的HOST_ID()之类的系统函数都能得到值,就唯此得不到,为什么这么怪?
附:
CREATE TABLE [dbo].[user_handle_history] (
[handle_id] [bigint] IDENTITY (1, 1) NOT NULL ,
[handle_type] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[table_code] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[data_id] [char] (15) COLLATE Chinese_PRC_CI_AS NULL ,
[data_name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[data_property] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[workstation] [varchar] (128) COLLATE Chinese_PRC_CI_AS NULL ,
[logon_name] [varchar] (15) COLLATE Chinese_PRC_CI_AS NULL ,
[handle_date] [datetime] NULL
) ON [PRIMARY]
我该怎么办?
问题点数:20、回复次数:22Top
1 楼gsh945(太平洋底)回复于 2006-08-04 14:44:36 得分 1
顶一个Top
2 楼moyanwuhen()回复于 2006-08-04 14:51:00 得分 0
大哥,我要解决方案,要在触发器里得到客户机的名字,怎么办??高手出招呀!斑主,快来救吾Top
3 楼moyanwuhen()回复于 2006-08-04 15:26:00 得分 0
有没有人知道?在线等呀!请问专家们都同时出去了吗?Top
4 楼Haiwer(海阔天空)回复于 2006-08-04 15:29:18 得分 2
HOST_NAME
USER_NAME
SUSER_NAME
SUSER_SNAME
这几个函数确实比较难确定
不过如果是在有域的局域网内,都能正常,其他的好像不一定
Top
5 楼Haiwer(海阔天空)回复于 2006-08-04 15:29:53 得分 0
你能改变网络的结构吗?
Top
6 楼moyanwuhen()回复于 2006-08-04 15:36:21 得分 0
可是system_user,getdate(),host_id()在触发器里都能获得,为什么单单就host_name得不到?可我需要这样做,有什么解决办法?我就是要在服务器的数据库里记录客户端的机器名呀!求~~~~Top
7 楼realgz(realgz)回复于 2006-08-04 15:36:57 得分 0
既然如此为什么不根据spid自己到 sysprocesses 去取?Top
8 楼moyanwuhen()回复于 2006-08-04 15:39:41 得分 0
机子全是一个局域网上的,该语句目的就是记录用户操作数据库的情况,如谁删了什么,谁改了什么资料等~~,我要用触发器获得用户信息,而且只能用触发UPDATE,DELETE,并不记录用户INSERT了什么,Top
9 楼moyanwuhen()回复于 2006-08-04 15:50:33 得分 0
那我给WORKSTATION字段付默认值:HOST_NAME()为什么也不可以?,,sysprocesses 我没用过,不知道能不能解决!去试试,希望还有别的办法,继续求~~~~~Top
10 楼moyanwuhen()回复于 2006-08-04 15:53:57 得分 0
请问怎么根据spid到 sysprocesses 去取?SPID用什么方法或函数怎么得到,没用过,不知道哦Top
11 楼realgz(realgz)回复于 2006-08-04 16:05:27 得分 2
select hostname from master..sysprocesses where spid=@@spidTop
12 楼moyanwuhen()回复于 2006-08-04 16:10:08 得分 0
可以没法用到下面的结构里呀!
INSERT INTO user_handle_history
(
handle_type,
table_code,
data_id,
data_name,
data_property,
workstation,
logon_name,
handle_date )
SELECT
'删除',
'cw_tax',
deleted.id,
deleted.name,
convert(varchar(50),deleted.result ),
HOST_NAME(),
system_user,
getdate()
FROM deleted ;
求救,谢~~~~~谢~~~~~~Top
13 楼realgz(realgz)回复于 2006-08-04 16:15:23 得分 2
子查询可以啊..汗
Top
14 楼moyanwuhen()回复于 2006-08-04 16:17:37 得分 0
不会哦~本来触发器就不大会写,呵呵~我去查查怎么写~哎~这个问题搞了一天,Top
15 楼moyanwuhen()回复于 2006-08-04 16:31:46 得分 0
可恶的SQLSERVER2000,还是不行,
我写的代码如下:
CREATE TRIGGER tu_cw_tax_history ON [dbo].[cw_tax]
FOR UPDATE
AS
declare @host as nchar(30)
select @host = hostname from master..sysprocesses where spid=@@spid
INSERT INTO user_handle_history
(
handle_type,
table_code,
data_id,
data_name,
data_property,
workstation )
SELECT
'修改',
'cw_tax',
deleted.id,
deleted.name,
convert(varchar(50),deleted.result ),
@host
FROM deleted ;
还是没获得,是不是触发器根本就得不到????上面的代码查询分析器可以得到其值.郁闷~~~~~~Top
16 楼moyanwuhen()回复于 2006-08-04 17:09:39 得分 0
各位专家,我得到结论:触发器里永远得不到HOST_NAME(),@@SPID也没用!不信可试试~~~~~!~Top
17 楼Haiwer(海阔天空)回复于 2006-08-04 17:55:49 得分 2
有没有换台客户端试试
Top
18 楼moyanwuhen()回复于 2006-08-04 18:14:36 得分 0
难道你们的机子触发器里可以得到此值???Top
19 楼hellowork(一两清风)回复于 2006-08-04 18:21:05 得分 5
我的机器是正常的.
请楼主把触发器改成这个样子,然后在查询分析器中执行update语句,看看能否打印出hostname值.
CREATE TRIGGER tu_cw_tax_history ON [dbo].[cw_tax]
FOR UPDATE
AS
print host_name()
declare @host as nchar(30)
select @host = hostname from master..sysprocesses where spid=@@spid
print @host
GO
----在另一个连接中测试,查看打印的结果
update cw_tax set .....Top
20 楼zxkid(如果你有勇气迈出第一步,未来又能糟糕成什么样呢?)回复于 2006-08-04 18:38:24 得分 2
把workstation的defaultvalue设为HOST_NAME()试试Top
21 楼hjmaAsC(继续补丁)回复于 2006-08-04 19:17:05 得分 2
SERVERPROPERTY('ServerName')Top
22 楼drk928(一起看斜阳)回复于 2006-08-05 08:35:58 得分 2
就好像函数里不能用随机函数一样,你建一个视图然后中转一下嘛.Top




