Sql server 当列发生更改时,如何通过SQL更新列?有点像木头!Microsoft SQL Server管理工作室

Sql server 当列发生更改时,如何通过SQL更新列?有点像木头!Microsoft SQL Server管理工作室,sql-server,Sql Server,好的,只是澄清一下:我有一个SQL表(包含ID、学校、学生ID、姓名、费用$、费用类型和支付(作为列))需要发布在网格上,并上传到网站上。网格正确显示了所有内容,并显示了需要支付的费用。Paid列有一个1或0的位数据类型(基本上是一个清单)。我被要求再添加两个列:User和DateChanged。原因是要记录哪些员工更改了“付费”列。它将只捕获在SQL表中更改它的人员的用户名以及时间。为了进一步澄清,我需要创建两个列:“User,DateChanged”,当有人更改“Paid”列时,这些列将记录

好的,只是澄清一下:我有一个SQL表(包含ID、学校、学生ID、姓名、费用$、费用类型和支付(作为列))需要发布在网格上,并上传到网站上。网格正确显示了所有内容,并显示了需要支付的费用。Paid列有一个1或0的位数据类型(基本上是一个清单)。我被要求再添加两个列:User和DateChanged。原因是要记录哪些员工更改了“付费”列。它将只捕获在SQL表中更改它的人员的用户名以及时间。为了进一步澄清,我需要创建两个列:“User,DateChanged”,当有人更改“Paid”列时,这些列将记录下来

例如:User:Bob在2017年5月2日晚上10点检查X student的Paid列

在X学生信息的同一行中,用户列下会出现Tom。根据日期更改,将显示2017-05-02晚上10点

我将采取什么措施使之成为可能


我现在是IT实习生,所有这些SQL的东西对我来说都是新的。如果你需要更多的澄清,请告诉我。仅供参考:两个新列:User,DateChanged将不在网格上。

如您所述,执行此操作的方法是使用触发器。下面我举了一些代码的例子,但请注意,触发器可能会产生意外的副作用,具体取决于数据库和应用程序界面的设置方式

如果您可以更改向数据库发送SQL查询的应用程序代码,那么这比使用触发器要安全得多。你仍然可以添加新字段,你只需要依靠应用程序来更新它们,而不是在SQL中完成所有操作

关于此代码,请记住以下事项:

  • 如果任何后台进程或过程对表进行更新,它将自动覆盖时间戳和用户名,因为这是在对相关行进行任何更新时触发的
  • 如果用户无法直接访问SQL Server(换句话说,应用程序是唯一连接到数据库的东西),则应用程序可能只为每个人使用一个数据库登录用户名,在这种情况下,除非您可以更改应用程序代码,否则您将无法确定是哪个用户进行了更新
  • 如果有人无意中更改了某个内容,然后又将其更改回来,则会覆盖您的时间戳,使其看起来像是错误的人进行了更新
  • 如果有大量的行和/或经常对表进行大量更新,触发器可能会使数据库系统陷入困境,因为触发器代码将在每次更新表中的行时执行
但是,如果您没有更改应用程序代码的权限,并且希望尝试使用触发器,那么下面是一些示例代码,可以满足您的需要:

create trigger TG_Payments_Update on Payments
after update
as
begin

update Payments 
set DateChanged = GetDate(), UserChanged = USER_NAME()
from Payments, inserted
where Payments.ID = inserted.ID

end

web应用程序已经知道当前用户在系统上工作,因此您的更新将只包括该用户的ID和操作发生时的当前系统时间


我不会依赖SQL Server触发器,因为它隐藏了系统中发生的事情。另外,正如其他人所说,它们也有副作用需要处理。

为此处提到的架构更改添加触发器,因此您需要更改表以添加列,然后在位标志更改时添加触发器以填充这些列。这里要考虑的另一件事是行版本控制。你是否只想看到最后一个改变它的人,或者最后三个?如果是后者,请查看行版本控制。有很多方法——每次更改行中的某些内容时,都会插入一个带有“effectiveDate”列的新行。如果这种情况经常发生,您的表将急剧增长,因此一定要研究它。