我有一系列可更新的视图,我们向最终用户公开作为后端流程的界面。
其中一个视图引用了两个表,并且需要一个INSTEAD OFforUPDATE和INSERTs的触发器。
表的结构是(大大简化):
Claim
(DataRowID bigint IDENTITY PRIMARY KEY
,<bunch of claim data>)
ClaimExtended
(ClaimDataRowID bigint FOREIGN KEY references dbo.Claim(DataRowID) NOT NULL
,<bunch of other claim data>)
Run Code Online (Sandbox Code Playgroud)
我最初的计划是在触发器中这样做:
CREATE TRIGGER [dbo].[MyTrigger] ON [dbo].[MyView]
INSTEAD OF INSERT
AS
DECLARE @IDLink TABLE
(RowID int
,ClaimDataRowID bigint)
DECLARE @Inserted TABLE
(RowID int identity (1,1) NOT NULL
,<all the columns from the view>)
INSERT INTO
@Inserted
(<View columns>)
SELECT
(<View columns>)
FROM
Inserted
INSERT INTO
Claim
(<Columns>) …Run Code Online (Sandbox Code Playgroud) trigger sql-server sql-server-2008-r2 identity output-clause
我遇到过这样的情况,我们的数据库中有几十个不同的触发器,它们触发将记录插入到数据库中的另一个(单个)表中。
我希望在测试我们的替换服务器时,有一些简单的方法可以在该单个表上设置触发器以有效地忽略所有其他触发器。(而不是必须删除数十个触发器,然后在我们投入生产时重新启用它们)。
我希望能够使用INSTEAD OF INSERT设置为不执行任何操作的函数的触发器,但您只能在视图上使用这些触发器,而不能在表上使用。我尝试了一个BEFORE INSERT 名为的触发器RAISE EXCEPTION,但这导致整个事务失败,因此对其他表的修改也被拒绝。
是否有一些简单的方法可以忽略对该表的插入,或者我应该做一个AFTER INSERT事后清除记录的操作?
在触发器中,我试图创建一个唯一的表名(使用NEWID()),我可以存储在插入和删除的表中找到的数据。
Declare @NewID varchar(50) = Replace(convert(Varchar(50),NEWID()),'-','')
Declare @SQLStr varchar(8000)
Set @SQLStr= 'Select * into [TMPIns' + @newID + '] from inserted'
Exec (@SQLStr)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:无效的对象名称“插入”
我知道我可以做到:
Select * into #inserted from inserted
Set @SQLStr= 'Select * into [TMPIns' + @newID + '] from #inserted'
Exec (@SQLStr)
Run Code Online (Sandbox Code Playgroud)
但是我不想使用 TempDB,因为这些表会变得很大,而且我也觉得它是多余的。有没有办法避免创建#inserted?
我正在测试登录触发器以限制与某些 IP 的连接。看起来触发器不正确。现在我无法登录到服务器,即使是SA.
有没有办法来解决这个问题?
在我们的生产数据库中添加和删除了一个登录触发器。master在添加触发器之后和删除之前,我有完整的备份。我正在尝试从备份中恢复,但在该server_triggers备份下看不到它。有没有办法从数据库备份中恢复登录触发器?
备份是从昨天晚上 11 点开始的。触发器是昨天早上添加的,今天早上删除了。
对 Prices 表中的大量行执行 DELETE 时,DELETE 会逐渐变慢。如果删除 15,000 行,它会在大约 15 秒内运行。20K 行需要 3 或 4 分钟。40,000 行需要 15 分钟,100,000 行运行一个多小时。
下面的 After DELETE 触发器使用可用价格类型的计数更新 Items 表。这用于计算价格以加快生产过程。
两个表都是InnoDB,我把innodb_buffer_pool_size更新为4G,没有效果。
我已经验证所有 SQL 语句都使用索引。Prices 表上有一个PriceType + ItemID 索引,ItemID 是Items 表的主键。
不幸的是,这个架构是由另一个应用程序确定的,我无法修改表结构。我可以修改触发器、索引等。无法更改该应用程序以直接更新 Items 表中的计数。
BEGIN
DECLARE iPriceTypeA INT;
DECLARE iPriceTypeB INT;
DECLARE iPriceTypeC INT;
SET iPriceTypeA = (SELECT COUNT(*) FROM Prices WHERE PriceType='A' AND ItemID=OLD.ItemID),
iPriceTypeB = (SELECT COUNT(*) FROM Prices WHERE PriceType='B' AND ItemID=OLD.ItemID),
iPriceTypeC = (SELECT COUNT(*) FROM Prices WHERE PriceType='C' AND ItemID=OLD.ItemID);
UPDATE …Run Code Online (Sandbox Code Playgroud) 在 PostgreSQL 9.5 中,我有表格中的列
prefix_last_modified timestamp without time zone NOT NULL DEFAULT (clock_timestamp() AT TIME ZONE 'UTC')
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种方法来设置在每次更新行时自动更新的最后修改的值,我发现这篇定义函数的好帖子:
CREATE OR REPLACE FUNCTION update_modified_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.modified = now();
RETURN NEW;
END;
$$ language 'plpgsql';
Run Code Online (Sandbox Code Playgroud)
现在,我想知道是否有任何方法可以将列名传递给 PostgreSQL 函数并将其执行到NEW行?例如
CREATE OR REPLACE FUNCTION update_modified_column(varchar column)
RETURNS TRIGGER AS $$
BEGIN
NEW.column = now();
RETURN NEW;
END;
$$ language 'plpgsql';
Run Code Online (Sandbox Code Playgroud) SQL Server 2012。
每当我的表中的记录发生更改时,我都需要使用当前日期和时间更新列 [LastUpdated]。目前我有:
CREATE TRIGGER Trig_LastUpdated ON Contact AFTER UPDATE
AS
SET NOCOUNT ON
UPDATE ct
SET LastUpdated = GETDATE()
FROM Contact ct
INNER JOIN Inserted i
ON ct.IDContact = i.IDContact
Run Code Online (Sandbox Code Playgroud)
但这是递归的,我不希望这样,会导致死锁和其他奇怪的事情。我无法全局关闭递归触发器。我看到 INSTEAD OF 触发器是非递归的,但是如果我这样做,我是否必须检查 Inserted 中的所有其他列以查看它是否已更新,或者 SQL Server 是否会为我处理?做到这一点的最佳方法是什么?
trigger sql-server deadlock sql-server-2012 row-modification-time
我有一张Images表,该表包含这些基本列 —
ImageId (int)
VotesUp (int)
VotesDown (int)
Run Code Online (Sandbox Code Playgroud)
每张图片都可以得到赞成票(向上、向下、收回投票)
upvotes 表有:
ImageId (int)
UserId (int)
Score (int ) [-1,0,+1]
Run Code Online (Sandbox Code Playgroud)
因此,如果 -
用户插入 +1 分数然后(如果不存在)我向upvotes表中添加一个新行并更新表中的值Images(用于快速获取)
用户将其分数从 +1 更改为 0,然后降低 votes up
votes up和增加
votes downvotes up 用户将其分数从 0 更改为 -1,然后增加 votes down
用户将其分数从 -1 更改为 0 然后降低 votes down
votes down 和增加votes up这是一个非常简单的逻辑。
这是upvotes桌子上的触发器:
alter TRIGGER [dbo].[UpvotesChanged] …Run Code Online (Sandbox Code Playgroud) 我已将一个简单的表添加到名为:aaa_log 的数据库中,其中包含列 :( id, name, op))
CREATE TABLE aaa_log (
[id] [int] IDENTITY(1,1) PRIMARY KEY NOT NULL,
[name] [varchar](50) NOT NULL,
[op] [varchar](50) NULL)
Run Code Online (Sandbox Code Playgroud)
id 列仅用于保持顺序的方式。
我for insert, update, delete使用以下脚本向数据库中的所有其他表添加了触发器 ( ):
declare @cmd varchar(max)
declare trigger_create cursor for
select 'Create trigger ['+TABLE_SCHEMA+'].[xxtr_'+TABLE_NAME+'_auto]
on ['+TABLE_SCHEMA+'].['+TABLE_NAME+'] fro insert,update,delete as
BEGIN
declare @op varchar(20)
if exists(SELECT * from inserted) and exists(SELECT * from deleted)
begin
set @op = ''update''
end
if exists(SELECT * from inserted) and not …Run Code Online (Sandbox Code Playgroud) trigger ×10
sql-server ×7
postgresql ×2
deadlock ×1
delete ×1
dynamic-sql ×1
identity ×1
mysql ×1
performance ×1
sql-clr ×1