我有一个表上有一个插入触发器.如果我在存储过程的一个insert语句中将6000条记录插入到此表中,那么存储过程是否会在插入触发器完成之前返回?
只是为了确保我正确思考,触发器应该只被调用(我知道'被称为'不是正确的词),因为只有一个插入语句,对吧?
我的主要问题是:即使触发器没有完成,sproc会完成吗?
我希望这对任何SQL人来说都是一个简单的问题...
我们有一个保存系统配置数据的表,它通过触发器绑定到历史表,因此我们可以跟踪谁更改了什么,何时更改.
我需要在此表中添加另一个值,但它会经常从代码中更改,并且要求我们不跟踪它的历史记录(我们不希望用数千个阻塞它的表)每天更新.
目前,我们的触发器有点像这样......
CREATE TRIGGER
[dbo].[SystemParameterInsertUpdate]
ON
[dbo].[SystemParameter]
FOR INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON
INSERT INTO SystemParameterHistory
(
Attribute,
ParameterValue,
ParameterDescription,
ChangeDate
)
SELECT
Attribute,
ParameterValue,
ParameterDescription,
ChangeDate
FROM Inserted AS I
END
Run Code Online (Sandbox Code Playgroud)
如果Attribute colum值以特定字符串为前缀(例如"NoHist_"),我希望能够添加一些逻辑来阻止它创建记录
鉴于我几乎没有使用触发器的经验,我想知道如何最好地实现这个...我已经尝试过如下的where子句
where I.Attribute NOT LIKE 'NoHist_%'
Run Code Online (Sandbox Code Playgroud)
但它似乎没有用.该值仍会复制到历史记录表中.
您可以提供的任何帮助将不胜感激.
好的 - 正如Cade Roux预测的那样,这次失败引起了多次更新.我将不得不对此采取新方法.有没有人有任何其他建议,拜托?
伙计们 - 请在这里教育我......为什么LEFT()在这种情况下会更喜欢LIKE?我知道我接受了答案,但我想知道我自己的教育.
我想创建一个Insert触发器,如果它们为null,则更新所有插入行的值,根据inserted表中的另一列,新值应从不同的表中获取.
我试过了:
UPDATE INSERTED
SET TheColumnToBeUpdated =
(
SELECT TheValueCol FROM AnotherTable.ValueCol
WHERE AnotherTable.ValudCol1 = INSERTED.ValueCol1
)
WHERE ValueCol IS NULL
Run Code Online (Sandbox Code Playgroud)
但我得到这个错误:
Msg 286, Level 16, State 1, Procedure ThisTable_INSERT, Line 15
The logical tables INSERTED and DELETED cannot be updated.
Run Code Online (Sandbox Code Playgroud)
我该怎么办?
我正在使用实体框架4,在表中使用实体框架插入新记录而不是插入触发器而表有一个标识列时,而不是触发器用于根据某些逻辑修改插入值之一,实体框架引发异常"存储更新,插入或删除语句影响了意外的行数(0).实体可能已被修改或删除,因为实体已加载.刷新ObjectStateManager条目".
任何人都可以帮助解决这个异常吗?
我想创建一个触发器上称为表需要在PostgreSQL中更新另一个表称为价值的学生 ,我试图做到这一点通过以下方式.但我收到一个错误,"OLD"附近有语法错误.我不明白这是怎么回事.这是我的代码:
CREATE OR REPLACE FUNCTION upd8_cred_func
(id1 VARCHAR, gr1 VARCHAR,id2 VARCHAR, gr2 VARCHAR)
RETURNS void AS $$
BEGIN
IF (id1=id2 and gr1 is null and gr2 is not null) THEN
update student set tot_cred = tot_cred + 6 where id = id1;
END IF;
RETURN;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER upd8_cred
AFTER UPDATE ON takes
FOR EACH ROW
EXECUTE PROCEDURE upd8_cred_func(OLD.id,OLD.grade,NEW.id,NEW.grade);
Run Code Online (Sandbox Code Playgroud) 这可能吗?我有兴趣找出在UPDATE请求中指定了哪些列,而不管正在发送的新值可能是也可能不是已存储在数据库中的值.
我想这样做的原因是因为我们有一个表可以从多个来源接收更新.以前,我们没有记录更新源自哪个来源.现在,该表存储了哪些源执行了最新更新.我们可以更改一些来源以发送标识符,但这不是所有内容的选项.所以我希望能够识别UPDATE请求何时没有标识符,以便我可以替换默认值.
所以我有两张这样的桌子......
ext_words
-------------
| id | word |
-------------
| 1 | this |
-------------
| 2 | that |
-------------
| 3 | this |
-------------
ext_words_count
---------------------
| id | word | count |
---------------------
| 1 | this | 2 |
---------------------
| 2 | that | 1 |
---------------------
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建一个触发器,它将:
ext_words_count.count时ext_words.word更新.使事情进一步复杂化,
ext_words.word在更新ext_words_count时不存在ext_words,我想将其插入ext_words_count并设置count为1.我一直在寻找类似的问题:
1. 使用自动增量字段插入触发器之前/之后,以及
2. 使用触发器更新另一个数据库中的表来
尝试组合2.这是我到目前为止所拥有的:
DELIMITER $$ …Run Code Online (Sandbox Code Playgroud) 如果我有一个列说column a任何给定的值,并且我希望另一列column b 具有default value根据值的值column a
换句话说:
如果column a = 'peter'那么column b default value = 'doctor'.
postgresql triggers database-design default-value postgresql-9.2
我正在尝试编写一个触发器,我有以下表格:BookingRequest:
+-----------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+----------------+
| idRequest | int(11) | NO | PRI | NULL | auto_increment |
| roomClass | int(11) | NO | | NULL | |
| inDate | date | NO | | NULL | |
| outDate | date | NO | | NULL | |
| numOfBeds | int(11) | NO | | NULL | |
| status | int(11) | NO | …Run Code Online (Sandbox Code Playgroud) 我在SQL Server 2008数据库的表上有以下触发器.它正在递归,所以我需要阻止它.
插入或更新记录后,我试图只更新该表上的单个字段.
这是触发器:
ALTER TRIGGER [dbo].[tblMediaAfterInsertOrUpdate]
ON [dbo].[tblMedia]
BEFORE INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON
DECLARE @IdMedia INTEGER,
@NewSubject NVARCHAR(200)
SELECT @IdMedia = IdMedia, @NewSubject = Title
FROM INSERTED
-- Now update the unique subject field.
-- NOTE: dbo.CreateUniqueSubject is my own function.
-- It just does some string manipulation.
UPDATE tblMedia
SET UniqueTitle = dbo.CreateUniqueSubject(@NewSubject) +
CAST((IdMedia) AS VARCHAR(10))
WHERE tblMedia.IdMedia = @IdMedia
END
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我如何防止触发器插入再次触发另一个触发器?
triggers ×10
postgresql ×3
sql ×3
sql-server ×3
insert ×2
mysql ×2
sql-update ×2
t-sql ×1
timing ×1