高难度问题,高分,请进

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

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

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

请高手解决帮忙。。。分是没有限制的,只要解决问题多少分都可以。谢谢
...全文
55 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)
【项目介绍】 C#课程作业-药品进销存管理系统源码+项目说明+sln解决方案.zip 药品进销存管理系统在药品的采购、入库、销售过程中,尤其是当下疫情期间,发挥了重要作用,它使得企业对药品的处理更加便利快捷,提供了优质的服务,大大简化了繁冗的工作,降低了药物管理成本。我们开发药品进销存管理系统就是采用现代化的信息管理方式代替手工管理方式,让药品能够更好、更高效地为医院、社会服务。 2 需求分析 2.1可行性分析 2.1.1**技术可行性** 就技术力量来说,可以完成此次开发工作,开发过程较为简单。目前掌握了mssql的操作方法,熟悉php语言,对网络技术和计算机组成原理有一定了解,具备独立编写数据库系统的能力。 2.1.2**经济可行性** 目标系统开发需求较低,开发周期较短,比较简单,开发难度不大。该系统的开发在一定程度上为使用者提供了便利,降低了人工管理的成本,在将来通过优化能进一步提高系统性能,带来更大便利。 2.1.3**管理可行性** 整个系统组成并不复杂,由个人独立开发,便于使用,因此操作管理难度不大。 2.2系统目标 药品进销存管理系统作为比较经典的信息管理系统,在开发阶段需在前后端两部分共同进行。其中,前端部分主要负责开发页面,将数据显示在界面上,后端部分主要负责数据库系统的建立及维护等工作。前者强调界面要人性化、要易于使用,而后者要求数据要有条理,便于维护。该系统开发需要注意信息系统化、规范化和自动化,要求系统能够稳定、长期运行,也要求系统要人性化、易于使用。 2.3 系统应该具备的功能 员工基本信息的查询、修改,包括员工uid、员工姓名、员工性别、员工电话号码等。 药品信息的查询、修改,包括id、名称、药品类别、药品数量。 药品生产厂商的查询、修改,包括厂商编号、厂商名称、电话号码、地址。 药品库存信息的查询、修改,包括仓库id、仓库名、药品数量。 药品进货信息的查询、修改,包括日期、id、单价、数量、厂商编号、存放仓库id。 药品零售信息的查询、修改,包括日期、id、单价、数量、客户id。 客户基本信息的查询、修改,包括客户uid、客户姓名、客户性别、客户电话号码等。 用户:能够查询药品信息、人员信息。 管理员:能够查询、修改药品信息、人员信息、管理员信息。 2.4 系统结构图 (根据需求分析,药品进销存管理系统的结构图如下:) ![药品进销存管理系统的结构图](./wps1.png) 3 概念设计 所要实现的功能设计,可能建立它们之间的关系,进而实现逻辑结构功能。药品进销存管理系统可以划分的实体有:药品信息实体、零售信息实体、客户信息实体、员工信息实体、进货信息实体等实体。 ![关系总体图](./wps2.jpg) 4 逻辑设计 (1)药品信息(药品编号,药品名称,药品数目,药品分类) (2)顾客(顾客编号,顾客姓名,顾客性别,联系电话) (3)员工(员工编号,员工姓名,员工性别,联系电话) (4)用户(用户编号,用户密码,用户权限) (5)厂商(厂商编号,厂商名称,厂商地址,联系电话) (6)仓库(仓库编号,仓库名称,药品数量) (7)进货(进货号,进货时间,药品编号,进货量,进货单价,厂商编号,仓库编号) (8)零售(零售号,零售时间,药品编号,零售量,零售单价,顾客编号) 5 数据库物理设计 把概念的模型转换为实际的数据库能够支称的逻辑的数据模型就是所谓的设计逻辑结构,然后将该逻辑结构设计成对应的表结构。综上情况分析,要8张数据实表才能达到系统所有的功能,它们依次为:药品信息表、客户表、员工表表、管理用户表、进货表、零售表、仓库表、厂商表。具体如下表所展现。 【备注】 1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载食用体验! 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。在使用过程中,如有问题或建议,请及时沟通。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈!

34,588

社区成员

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

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