Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 是否可以在一个表上创建和执行两个触发器_Sql_Sql Server_Database_Sql Server 2008 - Fatal编程技术网

Sql 是否可以在一个表上创建和执行两个触发器

Sql 是否可以在一个表上创建和执行两个触发器,sql,sql-server,database,sql-server-2008,Sql,Sql Server,Database,Sql Server 2008,我试图找到一些解决方法,为一个表上的不同表创建和执行多个触发器。我有两张桌子 人员详细信息 地址 此表的设计方式是,当用户更新人员的地址时,它会在地址表中创建一条新记录,而不是更新现有记录。当用户更新人员详细信息或地址时,我希望将更改插入auditlog表 我能够为person表创建一个触发器,但不知道如何通过在person表上使用或调用多个触发器来实现它 下面是Person表更新触发器的代码 CREATE TRIGGER [dbo].[tr_tblPersonDetail_ForUpda

我试图找到一些解决方法,为一个表上的不同表创建和执行多个触发器。我有两张桌子

  • 人员详细信息
  • 地址
此表的设计方式是,当用户更新人员的地址时,它会在地址表中创建一条新记录,而不是更新现有记录。当用户更新人员详细信息或地址时,我希望将更改插入auditlog表

我能够为person表创建一个触发器,但不知道如何通过在person表上使用或调用多个触发器来实现它

下面是Person表更新触发器的代码

 CREATE TRIGGER [dbo].[tr_tblPersonDetail_ForUpdate]
 ON  [dbo].[PersonDetail]
 FOR Update
AS 
BEGIN
Declare @Id int,                          
Declare @OldFirstName varchar(50), @NewFirstName varchar(50)

BEGIN

     Select @Id=personId,@NewFirstName = NewFirstName from Inserted

     select @OldFirstName = NewFirstName from deleted where @id = personId

  if(@OldFirstName <> @NewFirstName )
  Insert into AuditLog values('some value','AfterValue','Before Value')
CREATE TRIGGER[dbo]。[tr\u tblpersondeail\u ForUpdate]
在[dbo].[Persondeail]上
更新
作为
开始
声明@Id int,
声明@OldFirstName varchar(50),@NewFirstName varchar(50)
开始
从中选择@Id=personId、@NewFirstName=NewFirstName
从删除的@id=personId中选择@OldFirstName=NewFirstName
如果(@OldFirstName@NewFirstName)
插入到审核日志值中('some value'、'AfterValue'、'Before value')

是,一个表可能有多个触发器。但是,您确实需要谨慎-您可能不希望每次更新都触发两个触发器,或者您可能需要按特定顺序执行触发器

听起来您确实需要一个
而不是UPDATE
触发器来满足

在地址表中创建新记录,而不是更新现有记录

如果您只需要在特定字段更新时执行触发器,请使用来测试它们

您可以使用指示应该执行哪个触发器以及最后执行哪个触发器

在您的情况下,我建议对任何只更改姓名的操作使用更新后的
,然后使用
而不是更新
,处理地址更改的情况(也需要处理姓名更改)


如果您选择继续使用触发器。

不会回答您的问题,但请记住,
inserted
deleted
可以有多个行,我建议不要使用触发器。而是在存储过程中执行。如果您需要手动更新这些表中的任何一个,您或处理此问题的任何其他人都需要记住禁用触发器。是的,您可以在同一个表上创建任意数量的触发器。这根本不是问题。但是您的示例中的代码将失败,因为
Inserted
是一个可以容纳多行的表为什么不使用两个触发器而只使用两个inserts呢?或者你可以考虑使用<代码>合并连接< /Cord> @ DundAko,尽管我同意触发器不应该被使用太多,但是在更新表时没有理由禁用它们。触发器可以毫无问题地用于日志记录,何时使用它们取决于我们不知道的情况。在这种情况下,我明白了你的意思。你说的是什么,但是如果我在person表中有30列,如果我不检查每个列的更新情况,该怎么办。有没有其他方法我不必检查每一列?