我是数据库操作的新手。SQL Server 2008 R2 是我使用的数据库。
我需要将选定的行从临时数据库表移动到生产数据库表。我正在使用 SSIS 包来做到这一点。我在目标表上几乎没有触发器。当我将数据从源表传输到目标表时,我现在很困惑这些触发器是否会被触发。
如果在将数据从源表传输到目标表时不会触发这些触发器,在此数据传输过程中是否可以执行任何操作来触发这些触发器?
给我一些关于上述的信息将不胜感激。
更新:选定的行将被添加到目标表中。触发器将根据新插入的数据更新目标服务器中某个其他表中的数据。例如:
CREATE TRIGGER [MyTableChange]
ON [dbo].[DestinationTable]
AFTER INSERT,UPDATE
AS
BEGIN
declare @newid as int
select @newid=newid FROM INSERTED
Declare @total as int
declare @lookatme as int
select @total=total, @lookatme from DestinationTable where newid=@newid
update anothertable set total=total+@total where lookwhere=@lookatme
END
GO
Run Code Online (Sandbox Code Playgroud)
上面的触发器是一种示例,与我在原始触发器中的逻辑不完全相同。但它提供了我正在尝试做什么的信息。我将访问新插入的行详细信息以更新另一个表值。请不要将其视为语法和编写方式方面的正确触发器。我只是试图给出原始触发器的本质。
我有一个带有列的表 T1:
Name State time
mon 1 2014-01-09 11:23:00
tue 0 2014-01-07 14:40:00
wed 2 2014-01-08 09:23:00
thu 0 2014-01-09 12:23:00
Run Code Online (Sandbox Code Playgroud)
现在我想安排一个事件或开发一个触发器(如果可能),如果任何状态为 0/2 并且其时间距当前时间超过 24 小时,则应将其更新为 1。
例如在上表中, Tue 的 state 是 0 并且 time 超过 24 hours ,所以 state 应该更新为 1 并且同样适用于 wed ,但不适用于 thu 。
我经历了很多问题,例如:
但我还没明白,如何解决我的问题
假设我有两个表,表 A 和表 B。表 A 有一个插入触发器,可将记录插入表 B。表 B 有一个插入触发器,可将记录插入表 A。在这种情况下会发生什么?这两个触发器是否会一遍又一遍地将记录插入表中,直到数据库填满?这种情况发生的次数有限制吗?
对于 MySQL(实际上是 MariaDB)中的某些触发器,我有一些错误的“定义器”。我认为纠正它们的最简单方法是以下版本:
use information_schema;
update triggers set definer=current_user() where trigger_schema='foobar';
Run Code Online (Sandbox Code Playgroud)
它产生:
ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'information_schema'
Run Code Online (Sandbox Code Playgroud)
在同一个会话中,我可以使用“删除触发器”和“创建触发器”删除并重新创建触发器,因此我不了解权限问题。我的用户是否需要一些它没有的特权?
这是我的第一篇文章(英语不是我的母语)所以我希望我不会把这篇文章搞砸。
我是 MySQL 的新手,但我从 100 多个 youtube 教程和您的大量帖子中学到了很多东西。我使用 PHPmyadmin 和 MySQL Workbench 设计了我的数据库。
在我的表subventions(grants) 中,我创建了一个触发器,以便能够使用我的列subventions.début(beginning)、subventions.fin(end) 和subventions.montant(amount)来计算每年的赠款金额。
因为DATEDIFF只给了我几天的答复,我天真地以为我只需要除以365天就能得到我的答复。如果我的开始日期是 1 月 1 日,结束日期是 12 月 31 日,它会起作用,但如果它在一年中的其他地方出现,则不起作用。这是我的触发器:
SET NEW.montant_annuel = NEW.montant / (datediff(NEW.fin,NEW.début)/365)
Run Code Online (Sandbox Code Playgroud)
如果我使用 365.25(这是一年中的“真实”天数),它也不起作用。
谢谢!:)
编辑:我的问题是因为在而不是关闭插入触发器中有一个插入语句,那么它应该从而不是关闭插入触发器内部调用插入触发器,并且应该避免在测试表中插入行。我的观察是,插入触发器正在触发,但在关闭触发器之后,它已经在可测试中插入了新行。因为插入触发器引发错误,但关闭触发器已经在测试表中插入了一行。为什么不从内部调用插入触发器而不是从插入触发器中调用?
我在名为 TestTable 的表上有两个触发器。一个是代替插入触发器,第二个是插入触发器后。首先而不是插入触发器将触发,然后插入触发器。它在TestTable 和CopyTable 中插入新行,但不在AuditTable 中插入新行。
我的问题是为什么不触发插入触发器而不是触发器?它应该是因为它也在其中使用插入查询。为什么 TestTable 得到新插入的行?
我的表脚本
CREATE TABLE [dbo].[TestTable](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) NULL,
[Age] [int] NULL,
[DOB] [date] NULL,
[Address] [nvarchar](50) NULL,
CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED
Run Code Online (Sandbox Code Playgroud)
我的 SQL 查询:
Insert into dbo.TestTable values ('Waleed',24,'10-2-2015','Lahore');
Run Code Online (Sandbox Code Playgroud)
我的而不是插入触发器是:
ALTER TRIGGER [dbo].[utInsteadoff]
ON [dbo].[TestTable]
Instead of Insert
AS
Declare @Name as nvarchar(50)
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
Insert into …Run Code Online (Sandbox Code Playgroud) 我正在尝试制作一个日期时间字段,仅当某个字段发生更改时,该字段才会自动更新为当前时间。
看来我有语法错误。我尝试last_progress_date获取progress_percentage更新/编辑的日期:
CREATE OR ALTER TRIGGER last_progress_date
ON wp_task_mgr
AFTER UPDATE
AS BEGIN
IF UPDATE (progress_percentage)
SET last_progress_date = GETDATE()
END
Run Code Online (Sandbox Code Playgroud) 我将创建由触发器填充的历史表(在插入、更新、删除之后)。由于只有 20% 的列要更新,我决定只记录更改的值 - 如果值没有更改,NULL则将在历史表中使用值。例如:
sparse与记录所有数据的普通实现相比,历史表列将节省大量空间(这是由于我的测试和我的业务案例)。
作为我的SQL Server 2016 SP1 standard edition支持者,Change Data Capture我想知道他们使用它和基于触发器的日志记录之间有什么优点/缺点/区别?
trigger sql-server t-sql change-data-capture sql-server-2016
SQL SERVER 2014 - 有没有办法知道上次执行触发器的时间?
MS SQL 中的解决方案
MS SQL触发功能具有deleted与inserted在其中受操作的所有行存储系统表。您可以计算更新的行数:
set @updatedCount = (select count(*) from deleted)
Run Code Online (Sandbox Code Playgroud)
或找出最小值:
set @updatedMinimumCol1 = (select min(col1) from deleted)
Run Code Online (Sandbox Code Playgroud)
PostgreSQL 的问题
对于FOR EACH ROW触发器,我可以使用 OLD 和 NEW 系统记录,但它们每次调用触发器只存储 1 行。触发器的调用是分开的,所以如果用户更新 10 行,触发器将被调用 10 次,但每次我只能知道 1 个当前行,而不是所有 10 行。
因为FOR EACH STATEMENT我根本不知道任何访问更新行的机制。我使用 PostgreSQL v9.6,OLD TABLE并NEW TABLE在 v10 中引入。
PostgreSQL 不允许在语句级触发器中引用旧表和新表,即包含所有旧行和/或新行的表,这些表由 SQL 标准中的 OLD TABLE 和 NEW TABLE 子句引用。
尝试使用 transaction_timestamp() 附加列
我可以DEFAULT transaction_timestamp()向主表添加特殊列,然后使用它来区分刚刚更新的行与其他行,但这不是解决方案,因为多个INSERTs/UPDATEs …