标签: trigger

如何防止现有行/记录的更新但允许使用 PostgreSQL 触发器插入?

如何防止给定表中任何记录的更新,但允许插入,我已经创建了一个阻止更新的触发器,但我发现它也阻止插入。

编辑
我可以从数据库本身插入新行/记录,但不能从连接到该数据库的应用程序的新记录的表单中插入新行/记录,提交表单后,正在执行触发器。

它是一个使用 Django 构建的 Web 应用程序。

触发功能

CREATE OR REPLACE FUNCTION prevent_updte()
RETURNS trigger AS
$BODY$
BEGIN
RAISE EXCEPTION 'Data modification not allowed';
END;
$BODY$
LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud)

扳机

CREATE Trigger prevent_update
BEFORE UPDATE ON purchases_purchase
FOR EACH ROW
EXECUTE PROCEDURE prevent_update();
Run Code Online (Sandbox Code Playgroud)

postgresql trigger

4
推荐指数
1
解决办法
6949
查看次数

当具有动态 SQL 的 SP 出错时,触发器内部的 Catch 块不会被命中 - 导致较大的事务失败

我不喜欢触发器和动态 sql,但是,我正在使用的东西需要两者。

CREATE TRIGGER [dbo].[GenerateDynamicFormItemViews] ON [dbo].[tblFormItems] AFTER INSERT, UPDATE
AS
BEGIN   
    SET NOCOUNT ON;
    DECLARE @DatabaseName NVARCHAR(100)
    DECLARE @FormItemID INT

    DECLARE db_cursor CURSOR FOR
    SELECT SourceID,FormItemID from Inserted

    OPEN db_cursor  
    FETCH NEXT FROM db_cursor INTO @DatabaseName, @FormItemID

    WHILE @@FETCH_STATUS = 0  
    BEGIN  

        BEGIN TRY    
            EXEC spAddEditFormItemView @FormItemID, @DatabaseName WITH RESULT SETS NONE
        END TRY    
        BEGIN CATCH 
            INSERT INTO AdminErrorLog(SourceID, ErrorNumber, ErrorState, ErrorSeverity, ErrorProcedure, ErrorLine, ErrorMessage, ErrorDateTime) 
            SELECT @DatabaseName, ERROR_NUMBER(), ERROR_STATE(), ERROR_SEVERITY(), ERROR_PROCEDURE(), ERROR_LINE(), ERROR_MESSAGE(), GETDATE()
        END CATCH     

        FETCH NEXT …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server dynamic-sql transaction-log

4
推荐指数
1
解决办法
257
查看次数

如何在触发器中确定直接插入和通过存储过程插入

TableX 可以通过两种方式修改:

  • 客户执行“直接”插入
  • 客户端使用存储过程插入记录

如何在tableX的触发器中确定客户端的调用方式(直接或存储过程)

谢谢你。

trigger sql-server-2008

3
推荐指数
1
解决办法
504
查看次数

Oracle - 在“插入前”触发器中中止而不抛出异常

我知道这是一件糟糕的事情,原因有很多,但我处于“完成任务”模式,我们有一个我们无法修改的软件,可以将记录写入表。其中一些记录,出于业务原因,我们不希望出现在此表中。我想我可以编写一个触发器来“中止”这些行中的任何一行而不会抛出错误(这样应用程序就不会在前端失败,我们希望它认为它做了它的事情)。我非常熟悉这个应用程序,并且知道它不会造成任何丑陋的副作用,我们只是无法修改它以按照我们需要的方式运行。

那么,这有可能吗,如果没有,还有什么方法可以解决呢?我想过让某种工作定期清理我们不想要的记录表,但我宁愿这些记录永远不会在那里开始,所以在任何时候都没有程度的“肮脏”桌子。

trigger oracle oracle-10g vpd

3
推荐指数
1
解决办法
2万
查看次数

更新所有行时出错

当我更新单行时,它工作正常。但是当我更新所有行时:

 UPDATE cad_bilhetes
 SET ligacao_acobrar = 'False'
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

消息 512,级别 16,状态 1,过程 TG_CAD_BILHETES_UPDATE,第 34 行子查询返回了 1 个以上的值。当子查询跟随 =、!=、<、<=、>、>= 或当子查询用作表达式时,这是不允许的。该语句已终止。

在 TG_CAD_BILHETES_UPDATE 的第 34 行中有:

DECLARE @VALOR_LIGACOES_DDI_ATUAL DECIMAL(7,2)
Run Code Online (Sandbox Code Playgroud)

触发器的开始:

ALTER TRIGGER [dbo].[TG_CAD_BILHETES_UPDATE]
ON [dbo].[CAD_BILHETES]
INSTEAD OF UPDATE
AS
BEGIN
DECLARE @ID INT
DECLARE @VALOR_BILHETE_NOVO DECIMAL(7,2)
DECLARE @VALOR_BILHETE_ATUAL DECIMAL(7,2)
DECLARE @ENCONTROU INT
DECLARE @ID_CONTRATACAO INT
DECLARE @TIPO VARCHAR(2)
DECLARE @TIPO_APARELHO VARCHAR(1)
DECLARE @ID_COMPETENCIA INT
DECLARE @ID_CONTRATACAO_ATUAL INT
DECLARE @ID_CONTRATACAO_NOVO INT
DECLARE @VALOR_LIGACOES_DDD_FIXO_NOVO DECIMAL(7,2)
DECLARE @VALOR_LIGACOES_DDD_MOVEL_NOVO DECIMAL(7,2)
DECLARE @VALOR_LIGACOES_LOCAL_MOVEL_NOVO DECIMAL(7,2)
DECLARE @VALOR_LIGACOES_LOCAL_FIXO_NOVO DECIMAL(7,2) …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server-2005 sql-server

3
推荐指数
1
解决办法
1654
查看次数

进程列表将“%”显示为来自触发器的主机

我试图用调用者的主机/IP 填充表中的某个列。我在表上有一个插入触发器,它像这样设置列:

CREATE TRIGGER access_insert_trg BEFORE INSERT ON access
FOR EACH ROW 
set NEW.hostname = (select SUBSTRING_INDEX(host,':',1)
                    from information_schema.processlist 
                    WHERE ID=connection_id())
;
Run Code Online (Sandbox Code Playgroud)

%尽管当我在processlist表上手动运行相同的查询时,我得到了实际的主机名,但我最终还是得到了主机名。我已经检查了该connection_id()值,它是在主机列中processlist具有实际hostname:port值的行的 id 正确。

我无法弄清楚它是如何或为什么被转换为通用%:<port>值的。关于发生了什么以及如何解决它的任何想法?

如果有任何改变,我正在使用 MySQL 5.1.57。

mysql trigger insert

3
推荐指数
1
解决办法
2452
查看次数

消息 7391,SQL Server 上的分布式事务 (DTC)

这可能与 DBA 相关或与开发人员相关,老实说我不知道​​。

我有两个数据库服务器:

A: SQL Server 2005 (Trigger that uses DBMail on Server B)
B: SQL Server 2008 R2 (DBMail configured)
Run Code Online (Sandbox Code Playgroud)

我在服务器 A 中有一个表,其中电子邮件通知排队,我创建了一个“插入后”触发器来sp_send_dbmail使用服务器 B执行,就像这样......

A: SQL Server 2005 (Trigger that uses DBMail on Server B)
B: SQL Server 2008 R2 (DBMail configured)
Run Code Online (Sandbox Code Playgroud)

这就是我需要帮助的奇怪之处,请注意,这似乎是一个记录非常差(或严重缺乏)的功能。

现在我可以使用一些示例数据执行最后一条语句,一切正常。但是当我尝试像这样插入表格时......

USE SampleDB
ALTER TRIGGER [dbo].[mail_inserted] 
   ON [dbo].[tblEmailQueue]
   AFTER INSERT
AS 
BEGIN
    declare @MailTo nvarchar(max), @MailSubject nvarchar(max), @MailBody nvarchar(max)
    -- Initialize vars
    select @MailTo=MailTo from inserted
    select @MailSubject=MailSubject from inserted
    select @MailBody=MailBody from …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server linked-server msdtc distributed-transactions

3
推荐指数
1
解决办法
7501
查看次数

数据库触发器是替代品吗?

我有以下测验问题,由于有点困惑而无法自己回答。

请回答这个问题并告诉我为什么?

数据库触发器是替代品吗?

A. 存储过程
B. 实现参照完整性的主键
C.实现参照完整性的外键
D. 以上都是

trigger oracle

3
推荐指数
2
解决办法
1769
查看次数

触发器内的两个插入语句 - 键“PRIMARY”的重复条目“521-2”

我正在尝试创建一个插入触发器,以便当新用户插入users表中时(通过站点、httpd 和 php),此信息的一部分会插入到另一个管理对 wiki 的访问的表中。

新wiki用户表注册的用户id和默认组id(2)也应该插入到另一个wiki表中,这样一个新用户就属于一个默认组。

我这样编码:

USE users_web;

DELIMITER |
CREATE TRIGGER doku_users_ins AFTER INSERT ON users_web.users
       FOR EACH ROW
       BEGIN
                INSERT INTO users_web.doku_users (login, pass, email)
                       VALUES (NEW.user, md5(NEW.pass), NEW.email);

                INSERT INTO users_web.doku_usergroup (uid, gid)
                       SELECT du.uid, "2" FROM doku_users du
                            INNER JOIN users_web.users u ON NEW.user = du.login;

       END |

DELIMITER ;
Run Code Online (Sandbox Code Playgroud)

如果触发器仅由第一条INSERT语句组成,它运行良好,因为 doku_users 表插入了一个更多的寄存器。

但是当我像上面那样创建触发器时,使用这两个INSERT语句,我收到一个错误作为反馈:Duplicate entry '521-2' for key 'PRIMARY'.

我猜第二个 sql 语句试图NEW在它以某种方式可用之前读取该值。

我该如何解决这个问题?

mysql trigger

3
推荐指数
1
解决办法
1万
查看次数

我应该在 mysql 的从属设备中禁用触发器、时间戳吗?

我们正在使用 MySQL。我们有一个 master,最终会有 2 个 slave。当某些表中的数据发生变化时,数据库中有触发器会执行。我想知道是否禁用奴隶中的触发器。在我看来,我应该。似乎应该在从站中禁用时间戳之类的东西,否则从站上的数据将与主站上的数据不同。

我不是 DBA,我是开发人员。我们公司没有 DBA,所以运营管理员和我正在解决这个问题。我们已经设置并复制了主站和一个从站,我们在从站上遇到了重复输入错误。

我们正在考虑不要因为重复的复制错误而停止复制,如这篇文章所示:http : //www.ducea.com/2008/02/13/mysql-skip-duplicate-replication-errors/。我们不知道这是否是个好主意。我确实觉得这掩盖了问题,但我们都不知道如何解决问题。

如果我们应该禁用触发器和/或设置从属设备不插入时间戳,我们该怎么做?还是将 db 建立为从站会自动执行这些操作?

mysql replication trigger timestamp mysql-5.5

3
推荐指数
1
解决办法
3837
查看次数