标签: trigger

触发以创建对称行

我有一个表格,描述了两个项目之间的某种关系。项由 引用ID。我想创建一个触发器,所以每当你创建一行时(a,b),就会创建一个对称的行(b,a)。我试过在触发器之后创建,但它超过了堆栈深度,因为它在插入时调用了它自己。什么是正确的方法呢?

表看起来有点像这样:

CREATE TABLE MY_RELATION(
ID SERIAL,
THING1 INT NOT NULL,
THING2 INT NOT NULL,
PRIMARY KEY (ID)
);

CREATE TABLE MY_THING(
ID SERIAL,
VAL INT NOT NULL
PRIMARY KEY(ID)
);
ALTER TABLE MY_RELATION ADD FOREIGN KEY (THING1) REFERENCES MY_THING(ID);
ALTER TABLE MY_RELATION ADD FOREIGN KEY (THING2) REFERENCES MY_THING(ID);
Run Code Online (Sandbox Code Playgroud)

postgresql trigger database-design

5
推荐指数
1
解决办法
408
查看次数

“TRUNCATE 不运行 ON DELETE 触发器” true 或 false

我正在搜索为什么 TRUNCATE 被放置在 DDL 而不是 DML 中的主题,我在这里找到了以下答案 Why is truncate DDL?

我这个答案我发现了一个句子如下

“TRUNCATE 不运行 ON DELETE 触发器这一事实也使其与正常的 DML 操作区分开来”

这与MYSQL 参考手册相冲突,其中说

“如果 FOREIGN KEY 约束指定 DELETE CASCADE,则子(引用)表中的行将被删除,并且截断的表将变为空。”

我正处于一种迷茫的状态。请详细说明这个问题。

谢谢

mysql trigger truncate ddl mysql-5.0

5
推荐指数
1
解决办法
3950
查看次数

SQL Server 中有没有办法使表只能通过触发器插入?

标题是不言自明的,但如果您对我为什么想要这个感到好奇;我想要这个是因为我有一个存档/日志表来存储活动表的过去值,因此我不希望数据有以任何方式受到损害的风险。唯一应该在表上插入的是我在活动表上创建的触发器以记录其更改。在极少数情况下,我们可能需要手动编辑日志表,我将关闭(如果存在)“插入锁”

我将 SQL Server 2012 Enterprise 与 SQL Management Studio 结合使用

trigger sql-server permissions sql-server-2012

5
推荐指数
2
解决办法
2287
查看次数

分配具有动态列名的列

我得到了要在 ( BEFORE UPDATE) 触发器中设置的列的名称,我想将其设置为该OLD值并忽略传入的任何内容。我尝试了以下操作:

CREATE OR REPLACE FUNCTION prevent_column_update() RETURNS TRIGGER AS $$
  DECLARE
    col TEXT := TG_ARGV[0];
  BEGIN
    EXECUTE format('SELECT ($1).%I INTO ($2).%I', col, col) USING OLD, NEW;
    RETURN NEW;
  END;
  $$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

并使用如下:

CREATE TRIGGER request_protect_date_price_value
  BEFORE UPDATE OF date_price ON requests
  FOR EACH ROW EXECUTE PROCEDURE prevent_column_update('date_price');
Run Code Online (Sandbox Code Playgroud)

但是当更新它失败时:

ERROR:  syntax error at or near "("
LINE 1: SELECT ($1).date_price INTO ($2).date_price
                                    ^
QUERY:  SELECT ($1).date_price INTO ($2).date_price
Run Code Online (Sandbox Code Playgroud)

postgresql trigger dynamic-sql plpgsql postgresql-9.5

5
推荐指数
1
解决办法
6392
查看次数

检查可空数据的约束,如何处理?

这是我数据库中的表之一。为清楚起见,省略了约束。

CREATE TABLE [Person].[Person]
(
    [ID]                     INT           NOT NULL IDENTITY,       
    [Forename]               VARCHAR(16)   NOT NULL,
    [Surname]                VARCHAR(32)   NOT NULL,
    [Gender]                 CHAR(1)       NOT NULL DEFAULT 'U',
    [DateOfBirth]            DATETIME      NULL,
    [HobbiesAndInterests]    VARCHAR(256)  NULL,
    [AdditionalInformation]  VARCHAR(512)  NULL,
    [LocalCentreID]          INT           NOT NULL DEFAULT 0,
    [EmergencyContactID]     INT           NULL, 
)
Run Code Online (Sandbox Code Playgroud)

我的问题涉及出生日期字段。如果提供了值,我需要对日期进行检查。如果未提供值,则无需运行检查。

我基本上需要根据出生日期检查这个人是否年满 18 岁。如果未提供出生日期,则无需对其进行检查。

我想了几种不同的方法来解决这个问题:

第一个显然是在出生日期字段上设置检查约束,但我认为如果日期为空,这将失败。

另一种选择是在检查约束内使用标量 UDF。

我想到的最后一个选项是使用 AFTER INSERT/UPDATE 触发器来检查日期并在日期无效时回滚。

我和一位同事谈过,他说从技术上讲,我正在检查数据库中的业务规则,因此应该将这项检查推送到应用程序。

是否有“正确”的方法来解决这个问题,或者基本上是开发人员认为最好的方法?

trigger null sql-server check-constraints

5
推荐指数
1
解决办法
4843
查看次数

在 SQL Server 中更改禁用的触发器而不启用它

似乎触发器在更改后会自动启用。如何以编程方式更改触发器而不更改其启用/禁用状态?

重现代码:

create trigger trig
on MyTable
after insert
as select 0

go

disable trigger trig on MyTable

go

select is_disabled from sys.triggers where name = 'trig'

go

alter trigger trig
on MyTable
after insert
as select 1

go

select is_disabled from sys.triggers where name = 'trig'
Run Code Online (Sandbox Code Playgroud)

trigger sql-server

5
推荐指数
1
解决办法
734
查看次数

在 PostgreSQL 触发器过程上指定 STRICT 有什么作用吗?

在 PostgreSQL 中的触发器过程上指定CALLED ON NULL INPUT, RETURNS NULL ON NULL INPUTor STRICT( https://www.postgresql.org/docs/current/static/sql-createfunction.html ) 会起到什么作用吗?

由于触发器过程必须声明为不带参数的函数(https://www.postgresql.org/docs/current/static/plpgsql-trigger.html),我怀疑它有任何效果,但我找不到明确的答案关于这一点。

postgresql trigger stored-procedures functions

5
推荐指数
0
解决办法
182
查看次数

使用 MS SQL Server 上的触发器解决 ON DELETE CASCADE 循环

我的代码在 PostgreSQL 中运行良好,现在必须将其移植到 MS SQL Server。它涉及具有删除/更新事件潜在周期的表,并且 SQL Server 正在抱怨它:

-- TABLE t_parent
CREATE TABLE t_parent (m_id INT IDENTITY PRIMARY KEY NOT NULL, m_name nvarchar(450));

-- TABLE t_child
CREATE TABLE t_child (m_id INT IDENTITY PRIMARY KEY NOT NULL, m_name nvarchar(450),
    id_parent int CONSTRAINT fk_t_child_parent FOREIGN KEY REFERENCES t_parent(m_id)
    --ON DELETE CASCADE ON UPDATE CASCADE
);

-- TABLE t_link
CREATE TABLE t_link (m_id INT IDENTITY PRIMARY KEY NOT NULL,
    id_parent int CONSTRAINT fk_t_link_parent FOREIGN KEY REFERENCES t_parent(m_id)
    -- ON DELETE CASCADE ON …
Run Code Online (Sandbox Code Playgroud)

trigger foreign-key sql-server delete cascade

5
推荐指数
1
解决办法
3351
查看次数

当限制为一对多时,在一对多对多桥接关系中强制执行唯一性

我们定义了一系列配置,其中,在 RESTful API 的驱动下,最终用户可以构建新的修订版本。配置的某些组件可以有多个值;修订涉及具有一对多关系的多个表。

因为配置被运往别处,修订被标记为已部署,并且变得不可变。如果用户想对配置进行更改,他们必须创建一个新修订(可以从现有修订中克隆)。每个配置的一个 修订版可以标记为“当前”;这允许用户随意在过去的修订之间切换,或者通过不选择任何修订来完全禁用配置。当前版本已部署,当将不同版本标记为“当前”时,您将替换已部署的配置。

我们已经准备好了一切来强制部署修订的不变性;当您第一次使用修订作为当前修订时,该deployed列会自动转换为TRUE,并且所有进一步的INSERT,UPDATEDELETE与修订相关表中部署的修订 ID 匹配的行的操作都将被阻止。

但是,用于公共名称表中的name列的任何值在所有当前配置的所有“当前”修订中都必须是唯一的。我正在尝试找出执行此操作的最佳策略。

如果这是从配置到公共名称的简单一对多关系,则可以通过对name列使用唯一约束来解决。相反,这是一种一对多模式,revision充当桥接表,并将current_revision_id一对多对多关系“折叠”为从配置到虚拟的一对多关系公共名称。

这是一组简化的表格,用于说明我们的情况:

-- Configurations
CREATE TABLE config (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    current_revision_id INT
);

-- Have multiple revisions
CREATE TABLE revision (
    id INT PRIMARY KEY,
    config_id INT NOT NULL REFERENCES config(id),
    created_at TIMESTAMP WITH TIME ZONE …
Run Code Online (Sandbox Code Playgroud)

postgresql trigger physical-design unique-constraint

5
推荐指数
1
解决办法
155
查看次数

为什么 UPDATE FROM 失败而 MERGE 在具有 INSTEAD OF 触发器的视图上运行?

有时为了重构,我使用视图来抽象更改并使用INSTEAD OF触发器来模仿以前的功能。

我过去遇到过错误 414(或 415)

不允许 UPDATE,因为该语句更新参与联接并具有 INSTEAD OF UPDATE 触发器的视图“%.*ls”。

我可以将其重写UPDATE FROMMERGE语句并且有效。但为什么?

我找到了这些参考资料,但没有一个能回答原因。

/sf/ask/215952551/

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/87c173b0-8f87-4aa3-b861-d40f23803a43/views-and-instead-of-update-trigger-limitation-why?forum=transactsql

https://sqlserverfast.com/blog/hugo/2008/03/lets-deprecate-update-from/

trigger sql-server merge

5
推荐指数
1
解决办法
620
查看次数