高难度问题,高分,请进

iris_zhu 2003-02-26 07:29:55
我的数据库里面有4个表,a(用户要修改的表),b(存储使用软件的操作人员静态信息),c(存储使用软件的操作员的登录时间和操作员姓名。),d(表结构和a表一样只是多了三个字段,记录修改表a记录的操作员姓名,修改时间,和修改类型)。

比如说如果修改了表a的一条记录,那么就要在表d中添加两条记录,一条是修改之前的原记录另外一条是修改之后的记录。如果是添加或者删除的话就只添加一条记录,具体添加什么我想大家也明白了。

现在的问题是我该怎么做才能实现这些功能?我现在想的是在表a中增加三个触发器,相对应insert,delete,update.
现在的问题可能有几个操作员同时都在修改这个表,那么我怎么知道当前是哪个操作员在修改这个表呢?我只有知道了这个才能向d表里面添加操作员姓名。如果是单机版的话我可以从c表里面得到当前的操作员姓名,但是对于网络版就不知道怎么办了。

请高手解决帮忙。。。分是没有限制的,只要解决问题多少分都可以。谢谢
...全文
83 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
iris_zhu 2003-02-28
  • 打赏
  • 举报
回复
谢谢各位的帮助,我在努力中,深深的感谢
iris_zhu 2003-02-27
  • 打赏
  • 举报
回复
to:happydreamer(小黑)
你好,你的这个触发器的前提是要把软件操作人员等同于数据库登录人员吧,我的意思是说是不是按照ldy(探花郎)的方法之后再用你的方法?


再问一下,触发器里面是不是可以调用存储过程?
happydreamer 2003-02-27
  • 打赏
  • 举报
回复
看一下这个代码


CREATE TRIGGER tt ON dbo.a
FOR INSERT, UPDATE
AS
declare
@mcount int
if @@rowcount=0
return
if update(a表的一个字段)
insert into d
select getdate(),user--得到时间和操作用户
from inserted a

return




















iris_zhu 2003-02-27
  • 打赏
  • 举报
回复
正在考虑用存储过程呢,因为没有做过存储过程所以要研究研究了。:D
cyliao 2003-02-27
  • 打赏
  • 举报
回复
用過程做吧, 把操作者作為參數之一傳過來就行了, 這樣簡單一點
DJMPH 2003-02-27
  • 打赏
  • 举报
回复
先说程序:
我们程序认为modifier是操作员2,要是除了问题就是它的。
当然如果是你的做法,就是有你是记录,当然就看看历史记录。
再说业务:
在大多数公司,要么一个人做很多事,录入、修改、删除什么的;要么就是分很细,一个人录,领导才可以审核,删除,修改。很少公司有多余的人大家一起做相同的是,负担同样的责任。就是从飞计算机角度都是这样的。要是在这样的公司,即使有历史数据,区分责任也是一个麻烦的是,第一个要是做错了,那么第二个就没有责任了吗?不是,至少有检查不严格的连带责任。所以,这样的做法合理不合理你觉得呢?
当然你所说的情况有没有呢?有,在测试阶段多,因为什么,大家都知道,就那么几个测试人员要扮演所有角色,难免出问题。
我给你说的加个用操作员段是为了解决你得不到操作员编号的问题的。不是叫你没个表加四个,也不是说历史表就不好。
愉快的登山者 2003-02-27
  • 打赏
  • 举报
回复
建议你不要用触发器了,写一个存储过程进行统一处理。
参数除了包括业务数据外,还包括操作人员姓名。
这样就不会出现错误了。
iris_zhu 2003-02-27
  • 打赏
  • 举报
回复
to:DJMPH(冷开水)
你的意思我明白,如果遇到我下面说的情况该怎么办?
操作员1先登录然后修改表a,操作员2也登录然后也同时修改表a,那么对于表a来说字段modifier到底是哪个操作员呢?
iris_zhu 2003-02-27
  • 打赏
  • 举报
回复
to: tj_dns(愉快的登山者)
存在多用户同时使用这个软件的问题。你的意思是我更新成功之后再使用其它方法向表d插入数据而不是使用触发器?
DJMPH 2003-02-27
  • 打赏
  • 举报
回复
其实我的做法于 newdongkui(老乌鸦) 说的完全相似,但是和你不同,我不存历史数据。
那么,每一个表(当然是主要表)都有creator,createDate,modifier,modifier这四个字段,creator,modifier都从用操作人员来,createDate,modifier全部表都是一样的做法,默认值加触发器。
那么要是你想记录历史数据的话,只要在触发器里select modifier from inserted或select modifier from deleted就能得到操作这个或这些数据的操作人了,剩下的里组合好数据,就往历史表里添吧。
愉快的登山者 2003-02-27
  • 打赏
  • 举报
回复
建议修改表a(用户要修改的表)的结构,增加操作员姓名。这样问题就很好解决了。
iris_zhu 2003-02-27
  • 打赏
  • 举报
回复
to:newdongkui(老乌鸦)
谢谢你的积极参与,你的方法只能获得最近一次的修改情况,不能存储每次的修改记录。这个我还需要考虑考虑,我想得到每次对这个表所做的修改的详细记录。
iris_zhu 2003-02-27
  • 打赏
  • 举报
回复
to:DJMPH(冷开水)
你好,大侠,请问在哪个表里面存储这个登录者?表a吗?你的意思是不是一个操作员登录之后就update表a把字段modifier的所有记录等更新为登录者?如果是我理解的这个意思的话,那么如果当前这个登录者还没有退出数据库的时候另外一个登录者进入登录数据库的时候表a里面的modifier字段内容就要变成最新的登录者的姓名了,这样就不对了。:(
请解释一下你的想法,谢谢。

另外谢谢你的获得当前操作数据库的当前用户和添加登录的回答。
newdongkui 2003-02-27
  • 打赏
  • 举报
回复
从 oracle 那看,它的做法是
在 A 表里增加了字段
is_enable
creator
creation_datetime
last_updater
last_updated_datetime
这些字段
插入和修改没有问题,删除还需要考虑。
一般来说,很少情况要做delete , 大家都是改变有效值

DJMPH 2003-02-27
  • 打赏
  • 举报
回复
select USER_NAME()就可以得到操作数据库的当前用户。
sp_addlogin就能添加登陆。
但是我觉得你表里面建立一个字段modifier,存储操作数据的登陆者,然后在触发器里就能得到这个操作者了。
iris_zhu 2003-02-27
  • 打赏
  • 举报
回复
to:ldy(探花郎)
请问如果按照你说的去做,那么第一:我怎么在触发器里面得到当前的连接数据库的帐号呢?
第二: 我怎么动态向数据库里面添加帐号呢?就是在应用里面新加一个操作员我怎么相对应的给数据库添加连接帐号呢?
DJMPH 2003-02-27
  • 打赏
  • 举报
回复
to iris_zhu(个个)
我知道了,你是想在不依靠前台传出操作员数据的情况下通过一定的逻辑关系得到你所想要的操作员编号是吧。
那么你的那个逻辑关系就是@@SPID号、登陆时间于操作者之间的关系了。这个关系在某个特定的时间段是一一对应的没错,可是由于@@SPID的特殊性,在一个大的时间断不唯一,所以你的对应关系能不能可靠,或是说你能不能很好的操纵这些数据使他们具有不可否认性就有待你的努力了。 j9988(j9988)的说的很有用处。

在pb里要想获得@@SPID可以利用游标实现,
定义游标 for select @@SPID 或 select @@SPID from 任意一个表。
然后fetch into一次就关闭,得到的值就是@@SPID 了。好久不用,忘记完整语法了。

在cb里就是动态执行'select @@SPID '然后得到结果集。
iris_zhu 2003-02-27
  • 打赏
  • 举报
回复
我再来问,如何在pb里面获得@@SPID值?还有如何在cb里面获得这个值?因为我有两个版本的程序都要修改?谢谢 j9988(j9988)
j9988 2003-02-27
  • 打赏
  • 举报
回复
@@SPID
返回当前用户进程的服务器进程标识符 (ID)。


根据这个登录时间,好象不太准确。
你可以在记登录时间时,C表多加一个spid列=@@SPID,用户退出后让它为0。
然后触发器内对比。
select * from TabC where spid=@@spid

(具体我没试过)
iris_zhu 2003-02-27
  • 打赏
  • 举报
回复
to:XLYT(雨田)
不好意思,说的不够明白,要想d表里面写的系统的操作员的信息
加载更多回复(8)

34,874

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧