标签: trigger

如何使用触发器中新插入的同一行的值更新列?

使用 SQL Server 2014,我有这个:

Table1
Tab1_id        int identity(1,1) primary key
Tab1_val1      smallint
Tab1_val2      smallint
Tab1_valInfo   varchar(10) -- not yet implemented, will be used only for presentation
Run Code Online (Sandbox Code Playgroud)
 Tab1_id |   Tab1_val1 |   Tab1_val2 | Tab1_valInfo
---------|-------------|-------------|--------------
       1 |          25 |          19 | 0025-0019
       2 |           0 |           5 | 0000-0005
       3 |          12 |           3 | 0012-0003
Run Code Online (Sandbox Code Playgroud)

现在,凭借我相当短的 SQL 经验,我正在尝试的是:

在应用程序中,插入数据所需的唯一输入值是Tab1_val1Tab1_val2,然后创建一个更新列的触发器Tab1_valInfo

create trigger utr_ValInfo on Table1
after insert as
begin

    declare @size int = 4;

    declare …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server update sql-server-2014

1
推荐指数
1
解决办法
2万
查看次数

创建更新后触发器后无法更新表

我有一张这样的桌子

/*Table: pageprivilege*/
------------------------

/*Column Information*/
----------------------

FIELD   TYPE              COLLATION          NULL    KEY     DEFAULT  Extra           PRIVILEGES                       COMMENT
------  ----------------  -----------------  ------  ------  -------  --------------  -------------------------------  -------
id      INT(10) UNSIGNED  (NULL)             NO      PRI     (NULL)   AUTO_INCREMENT  SELECT,INSERT,UPDATE,REFERENCES         
pageid  VARCHAR(20)       latin1_swedish_ci  YES             (NULL)                   SELECT,INSERT,UPDATE,REFERENCES         
roleid  TINYINT(4)        (NULL)             YES             (NULL)                   SELECT,INSERT,UPDATE,REFERENCES         
ad      TINYINT(1)        (NULL)             YES             0                        SELECT,INSERT,UPDATE,REFERENCES         
ed      TINYINT(1)        (NULL)             YES             0                        SELECT,INSERT,UPDATE,REFERENCES         
dl      TINYINT(1)        (NULL)             YES             0                        SELECT,INSERT,UPDATE,REFERENCES         
rd      TINYINT(1)        (NULL)             YES             0                        SELECT,INSERT,UPDATE,REFERENCES         
st      TINYINT(1)        (NULL)             YES             0                        SELECT,INSERT,UPDATE,REFERENCES   
Run Code Online (Sandbox Code Playgroud)

我有一个条件,如果行被更新,这样

ad、ed、dl、rd 都设置为 0 …

mysql trigger stored-procedures

1
推荐指数
1
解决办法
2万
查看次数

游标和触发器有什么区别?

我试图理解为什么使用 Cursosr 或者它们是如何工作的(我是新手)。

我真的没有找到使用它的明确目的。

它与触发器相比如何?

mysql mariadb trigger cursors

1
推荐指数
1
解决办法
4231
查看次数

触发器和事务之间的区别

我正在实施电影分级服务,所以我正在考虑使用触发器或事务。

我正在考虑的是将电影信息插入到 movie_list 中,并将该电影的类型插入到 movie_genre_list 中。

在这种情况下,我的想法是编写一个触发器,在插入电影信息时插入流派。

但是,我不知道触发器或事务是否适合这种情况。我该怎么办?

trigger transaction

1
推荐指数
1
解决办法
2304
查看次数

使用变量 Select 和 Order by 触发

有没有办法设置触发器,它会在创建新表后激活并获取新表名称?我能够提出下面的查询,但它只能按字母顺序获取第一个查询,而不是按创建日期

CREATE TRIGGER CreateTable
ON DATABASE
    FOR CREATE_TABLE
AS
     DECLARE
       @table varchar(max);
     SELECT  top 1  @table =   [name] FROM sys.tables 
     insert into NewTable values(@table)
     ;
     end
Run Code Online (Sandbox Code Playgroud)

trigger sql-server table

1
推荐指数
1
解决办法
634
查看次数

如何绕过触发器?

假设我有下表:

Create Table [dbo].[Test_IP]
(
  [IP] varchar(40),
  [IPType] varchar(6)
)
Run Code Online (Sandbox Code Playgroud)

这个表上有更多的触发器,但它们都是 AFTER 触发器,它是一个大数据库,有很多表、视图和存储过程,并且它被多个进程使用。

我添加了一个日志表和这样的触发器

Create Table [dbo].[Log_Test_IP]
(
  [Action] varchar(10),
  [IP] varchar(40),
  [IPType] varchar(6)
)
GO
Create Trigger MYTR_Log_Test_IP_INS On [dbo].[Test_IP] After insert AS
BEGIN 
   insert into  [dbo].[Log_Test_IP]([Action],[IP],[IPType]) 
       select 'Insert', [IP], [IPType] from inserted 
END
GO
Create Trigger MYTR_Log_Test_IP_DEL On [dbo].[Test_IP] After delete AS
BEGIN
   insert into  [dbo].[Log_Test_IP]([Action],[IP],[IPType]) 
       select 'Delete', [IP], [IPType] from deleted  
END
GO
Run Code Online (Sandbox Code Playgroud)

现在我进入了有趣的部分:当我直接插入到Test_IP表中时,我可以看到 Insert 触发器正在工作,但是当它从应用程序或服务(我不知道它是做什么的)定期工作时,我不知道看到日志表中的任何插入记录,我只能看到“删除”记录,即使它在开始时是空的。

我的结论是有一些方法可以绕过触发器,数据库中有很多触发器和存储过程,我不知道去哪里找。

所以,我的问题是如何绕过触发器?

trigger sql-server

1
推荐指数
1
解决办法
881
查看次数

触发功能不存在,但我很确定它存在

我有一个程序:

create or replace procedure pro_update_last_read(in input_sensor_id integer, in read_time timestamp)
as
$$
begin
    update sensor
    set last_read = read_time
    where sensor_id = input_sensor_id;
end;
$$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)

以及一个调用它的触发器:

create trigger tri_last_read
    after insert or update of report_time
    on report
execute procedure pro_update_last_read(sensor_id, report_time);
Run Code Online (Sandbox Code Playgroud)

但是,在创建触发器时,我收到错误消息:

 [42883] ERROR: function pro_update_last_read() does not exist
Run Code Online (Sandbox Code Playgroud)

为什么会发生这个错误?

postgresql trigger stored-procedures plpgsql functions

1
推荐指数
1
解决办法
4473
查看次数

如果我能够通过 sqlcmd 连接到服务器,为什么还需要 DAC?

当我无法使用传统方式连接到SQL Server(原因是删除登录触发器)时,DAC引起了我的注意。我在网上做了一些搜索,结果发现访问服务器的唯一方法是使用 DAC 连接,不幸的是默认情况下该连接是关闭的。但是,我仅使用 sqlcmd 就能够解决这个问题(我删除了触发器)。

我的问题是,如果我可以仅使用 sqlcmd 连接到 SQL Server,那么 DAC 的用途是什么?

trigger sqlcmd logins sql-server-2014 dac

1
推荐指数
1
解决办法
79
查看次数

为什么即使基础表没有改变我的触发器也会被调用?

我有一个非常基本的触发器定义如下:

CREATE TRIGGER dbo.foo
ON dbo.bar
FOR INSERT, UPDATE, DELETE
AS
   ...
Run Code Online (Sandbox Code Playgroud)

我还有一个存储过程,它在某些时候会做这样的事情:

Insert into dbo.bar (a) select a from @bar
Run Code Online (Sandbox Code Playgroud)

当@bar 包含一些数据时,我的触发器会按预期调用,但当它不包含时,即使 dbo.bar 显然没有更改,也会调用触发器。

SQL 探查器和 sys.dm_exec_trigger_stats 的内容都证实了这一点。

SQL Profiler 报告占用空间非常低(3 次读取,0 次写入),但由于我有很多触发器,因此这种情况经常发生,并且最终得到了重要的 total_reads 数字。

关于为什么会发生这种情况的任何提示?有没有办法改变这种行为?

trigger sql-server sql-server-2008-r2

0
推荐指数
1
解决办法
75
查看次数

如何设置删除多个父行和子行的触发器?

以下是相关表格:

Table_B
B_ID(PK)  Name  A_Id
1         A     1
2         B     1

Table_C
C_ID   B_Id(FK)
1      1
2      1
Run Code Online (Sandbox Code Playgroud)

现在我想Table_B从它的表中删除行Table_C。以下是我正在触发的查询:

delete from Table_B where A_Id = 1
Run Code Online (Sandbox Code Playgroud)

我也想从其子项中删除所有行。可以用触发器吗?我在 上做了一个触发器Table_B,但它只删除了一行;所以我必须运行一个循环。

谢谢。

trigger sql-server

0
推荐指数
1
解决办法
1094
查看次数