我在 PostgreSql 9.1 中有一个触发器,我想在插入多个表时触发它。是否可以让它影响所有这些表而不是为所有这些表创建触发器?我有 58 个表,我想使用调用触发器函数的同一个插入触发器,所以我一直在使用
create trigger tuweke
after insert on product
for each row execute procedure tuwekeAdjustextract();
create trigger tuweke
after insert on caneweightment
for each row execute procedure tuwekeAdjustextract();
...
Run Code Online (Sandbox Code Playgroud)
对所有这些表都这样做,然后我们有多个模式,所以工作量很大,这可以在一个查询中完成吗?然后影响该模式或整个数据库中的所有表?
我有一个带有 SQL Server 托管数据库的应用程序。我无权访问应用程序代码,但我可以完全访问数据库。我已将自己的自定义审计添加到表中以帮助调试。
我正在使用after触发器。以下是我的触发器的简化版本。
问题:我看到update在相应insert审计记录之前的审计记录。这怎么可能?差异只有几毫秒,对于我目前的目的并不重要,但我可以想象更糟糕的情况,其中程序逻辑取决于正确的年表。
我知道在相同类型的触发器(全部insert或全部update)之间控制触发器执行顺序的方法。我可以对异构触发器执行顺序做出哪些假设?
create trigger dbo.MyTrigger_i on dbo.theTable
after insert
as
begin
set nocount on
declare @Date datetime, @User sysname
set @Date = GETDATE()
set @User = SUSER_SNAME()
insert into MyAudit (RowID, [Date], UserName, Comment)
select i.ID, @Date, @User, 'Insert'
from
inserted as i
end
go
create trigger dbo.MyTrigger_u on dbo.theTable
after update
as
begin
set nocount on
declare @Date datetime, @User sysname
set @Date …Run Code Online (Sandbox Code Playgroud) 我在 x86_64-unknown-linux-gnu 上的 PostgreSQL 9.4.3 中的表和触发器,由 gcc (Debian 4.9.2-10) 4.9.2,64 位编译:
CREATE TABLE measurements (
measurement_id SERIAL PRIMARY KEY NOT NULL,
measurement_size_in_bytes INTEGER NOT NULL
);
CREATE TABLE file_headers (
header_id SERIAL PRIMARY KEY NOT NULL,
measurement_id INTEGER NOT NULL,
file_header_index_start INTEGER,
file_header_index_end INTEGER
);
CREATE TRIGGER measurement_ids AFTER INSERT
ON measurements FOR EACH ROW
EXECUTE PROCEDURE ins_function('SELECT measurement_id FROM measurements
ORDER BY measurement_id desc limit 1;', 1, 666 );
Run Code Online (Sandbox Code Playgroud)
在那里我假设 SELECT 的数据类型自 SERIAL 以来是 INTEGER 但它显然是错误的,因为我从这个启动触发器的命令中收到错误消息:
INSERT INTO measurements …Run Code Online (Sandbox Code Playgroud) 我正在使用 MS-SQL 2008 R2 中的数据库,但遇到了问题。
基本设置是这样的: 有两个感兴趣的表:dbo.Assesments 和 audit.Assesments。dbo.Assesments 是工作数据表,并具有数据更改(插入、更新、删除)触发器以更新带有更改日志的 audit.Assesments。据我所知,这已经工作了多年,到目前为止一切顺利。
我们的 L2 支持有一个名为 SupportRole 的角色,他们通过 WinAuth 进入该角色,并且该角色具有一些存储过程的选择权限和执行权限。其中一个存储过程会更新 dbo.Assesments。这就是问题所在:更新进入,存储过程触发以将审计行插入到 audit.Assesments,然后他们立即得到“插入被拒绝,插入权限不足”,事务角色返回等。
这让我很困惑:我曾认为触发器更像是存储过程,如果它们被创建,他们有权做任何他们正在做的事情,但这让我三思而后行。我不想为审计表/模式的支持角色授予插入权限。我该怎么办?
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) 当表具有 json 或 jsonb 列时,是否无法在 INSERT/UPDATE 触发器中进行全行比较?我收到的错误让我认为我需要单独比较每一列,因为该NEW.*/OLD.*格式不能用于比较 json 列。
CREATE OR REPLACE FUNCTION on_insert_update_modified()
RETURNS TRIGGER AS $$
BEGIN
IF row(NEW.*) IS DISTINCT FROM row(OLD.*) THEN
NEW.modified_at = now();
RETURN NEW;
ELSE
RETURN OLD;
END IF;
END;
$$ language 'plpgsql';
CREATE TRIGGER mytable_insert_update
BEFORE INSERT OR UPDATE ON mytable
FOR EACH ROW
EXECUTE PROCEDURE on_insert_update_modified();
Run Code Online (Sandbox Code Playgroud)
当我插入包含 json 和 jsonb 列的表时,出现以下错误:
CREATE OR REPLACE FUNCTION on_insert_update_modified()
RETURNS TRIGGER AS $$
BEGIN
IF row(NEW.*) IS DISTINCT FROM row(OLD.*) THEN
NEW.modified_at …Run Code Online (Sandbox Code Playgroud) 我有一个 PostgreSQL 表phase_steps,包含以下示例行:
phase_step_id|step_type|step_status|
-------------+---------+-----------+
1| RESEARCH| |
2| SURVEY| |
Run Code Online (Sandbox Code Playgroud)
更新step_status列的值取决于该值
step_type是什么。
当step_type为“RESEARCH”时,只能输入“COMPLETE”或“INCOMPLETE”值step_status。
当step_type为“SURVEY”时,只能输入“ASSIGNED”或“NOT ASSIGNED”值step_status。
step_status我尝试通过以下过程管理“研究”约束:
create or replace function insert_step_status_value() returns trigger as $$
begin
if (new.step_status != 'COMPLETE') or (new.step_status != 'INCOMPLETE')
from phase_steps where step_type = 'RESEARCH'
then
raise exception 'Status value not in range for this phase step';
end if;
return new;
end;
$$ language plpgsql;
create trigger check_step_status_value before update …Run Code Online (Sandbox Code Playgroud) postgresql trigger database-design constraint check-constraints
我正在创建一个存储足球比赛的数据库。
每轮,任何特定的足球俱乐部只能踢一场比赛(主场或客场)。
例如,插入后
INSERT INTO Match (Round, Home, Away) VALUES (1, Barcelona, Real);
插入例如
INSERT INTO Match (Round, Home, Away) VALUES (1, Bayern, Barcelona);
INSERT INTO Match (Round, Home, Away) VALUES (1, Barcelona, Bayern);
必须被禁止,因为巴塞罗那已经在第一轮与皇马打了一场比赛。他们不应该能够在同一轮对阵拜仁(无论是主场还是客场)。
如何确保不会发生此类插入?
我使用触发器吗?某种唯一的索引组合?我两种都尝试过,但都迷路了,实际上并没有得到预期的结果。
谢谢
trigger ×10
postgresql ×5
sql-server ×4
constraint ×2
plpgsql ×2
datatypes ×1
deadlock ×1
index ×1
json ×1
permissions ×1
schema ×1