使用 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_val1和Tab1_val2,然后创建一个更新列的触发器Tab1_valInfo。
create trigger utr_ValInfo on Table1
after insert as
begin
declare @size int = 4;
declare …Run Code Online (Sandbox Code Playgroud) 我有一张这样的桌子
/*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 …
我试图理解为什么使用 Cursosr 或者它们是如何工作的(我是新手)。
我真的没有找到使用它的明确目的。
它与触发器相比如何?
我正在实施电影分级服务,所以我正在考虑使用触发器或事务。
我正在考虑的是将电影信息插入到 movie_list 中,并将该电影的类型插入到 movie_genre_list 中。
在这种情况下,我的想法是编写一个触发器,在插入电影信息时插入流派。
但是,我不知道触发器或事务是否适合这种情况。我该怎么办?
有没有办法设置触发器,它会在创建新表后激活并获取新表名称?我能够提出下面的查询,但它只能按字母顺序获取第一个查询,而不是按创建日期
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) 假设我有下表:
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 触发器正在工作,但是当它从应用程序或服务(我不知道它是做什么的)定期工作时,我不知道看到日志表中的任何插入记录,我只能看到“删除”记录,即使它在开始时是空的。
我的结论是有一些方法可以绕过触发器,数据库中有很多触发器和存储过程,我不知道去哪里找。
所以,我的问题是如何绕过触发器?
我有一个程序:
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)
但是,在创建触发器时,我收到错误消息:
Run Code Online (Sandbox Code Playgroud)[42883] ERROR: function pro_update_last_read() does not exist
为什么会发生这个错误?
当我无法使用传统方式连接到SQL Server(原因是删除登录触发器)时,DAC引起了我的注意。我在网上做了一些搜索,结果发现访问服务器的唯一方法是使用 DAC 连接,不幸的是默认情况下该连接是关闭的。但是,我仅使用 sqlcmd 就能够解决这个问题(我删除了触发器)。
我的问题是,如果我可以仅使用 sqlcmd 连接到 SQL Server,那么 DAC 的用途是什么?
我有一个非常基本的触发器定义如下:
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 数字。
关于为什么会发生这种情况的任何提示?有没有办法改变这种行为?
以下是相关表格:
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 ×10
sql-server ×5
mysql ×2
cursors ×1
dac ×1
functions ×1
logins ×1
mariadb ×1
plpgsql ×1
postgresql ×1
sqlcmd ×1
table ×1
transaction ×1
update ×1