Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Stored procedures firebird将触发器更改为存储过程_Stored Procedures_Firebird - Fatal编程技术网

Stored procedures firebird将触发器更改为存储过程

Stored procedures firebird将触发器更改为存储过程,stored-procedures,firebird,Stored Procedures,Firebird,如何将触发器更改为store Procure?我有以下代码: CREATE PROCEDURE PESTADOTRIGGER ( disparador varchar(40), estado integer) as declare variable cadena varchar(500); begin if (:estado = 1) then begin cadena = 'ALTER TRIGGER ' || :disparador ||

如何将触发器更改为store Procure?我有以下代码:

CREATE PROCEDURE PESTADOTRIGGER (
    disparador varchar(40),
    estado integer)
as
declare variable cadena varchar(500);
begin

    if (:estado = 1) then
    begin
        cadena = 'ALTER TRIGGER ' || :disparador ||  ' ACTIVE';
        EXECUTE STATEMENT :CADENA  WITH AUTONOMOUS TRANSACTION;
    END
    ELSE
    begin 
        cadena = 'ALTER TRIGGER ' || :disparador ||  ' INACTIVE';
        EXECUTE STATEMENT :CADENA  WITH AUTONOMOUS TRANSACTION;
    END

end
执行存储过程时,显示一条消息:

不成功的元数据更新修改触发器失败没有针对的对等会话 控制对表的访问


我正在使用SYSDBA用户运行该过程,但它不起作用

您应该检查您的数据库用户。触发器可以由创建者、SYSDBA用户和具有超级用户权限的其他用户更改

尝试以SYSDBA用户的身份执行存储过程

编辑
这是我的测试数据库

/******************************************************************************/
/****        Generated by IBExpert 2015.9.28.1 08.10.2015 19:06:46         ****/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES UTF8;

CREATE DATABASE '127.0.0.1:C:\DB\Test.FDB'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 16384
DEFAULT CHARACTER SET UTF8 COLLATION UTF8;



/******************************************************************************/
/****                              Generators                              ****/
/******************************************************************************/

CREATE GENERATOR GEN_TEST_ID;
SET GENERATOR GEN_TEST_ID TO 0;



/******************************************************************************/
/****                          Stored procedures                           ****/
/******************************************************************************/



SET TERM ^ ;

CREATE PROCEDURE PESTADOTRIGGER (
    DISPARADOR VARCHAR(40),
    ESTADO INTEGER)
AS
BEGIN
  EXIT;
END^






SET TERM ; ^



/******************************************************************************/
/****                                Tables                                ****/
/******************************************************************************/



CREATE TABLE TEST (
    ID   BIGINT NOT NULL,
    TXT  VARCHAR(50)
);




/******************************************************************************/
/****                             Primary keys                             ****/
/******************************************************************************/

ALTER TABLE TEST ADD PRIMARY KEY (ID);


/******************************************************************************/
/****                               Triggers                               ****/
/******************************************************************************/



SET TERM ^ ;



/******************************************************************************/
/****                         Triggers for tables                          ****/
/******************************************************************************/



/* Trigger: TEST_BI */
CREATE TRIGGER TEST_BI FOR TEST
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.ID is null) then
    new.ID = gen_id(GEN_TEST_ID,1);
end
^


/* Trigger: TEST_TRIGGER */
CREATE TRIGGER TEST_TRIGGER FOR TEST
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  if (new.TXT='ABC') then
  begin
    new.TXT='CBA';
  end
end
^

SET TERM ; ^



/******************************************************************************/
/****                          Stored procedures                           ****/
/******************************************************************************/



SET TERM ^ ;

ALTER PROCEDURE PESTADOTRIGGER (
    DISPARADOR VARCHAR(40),
    ESTADO INTEGER)
AS
declare variable cadena varchar(500);
begin

    if (:estado = 1) then
    begin
        cadena = 'ALTER TRIGGER ' || :disparador ||  ' ACTIVE';
        EXECUTE STATEMENT :CADENA  WITH AUTONOMOUS TRANSACTION;
    END
    ELSE
    begin 
        cadena = 'ALTER TRIGGER ' || :disparador ||  ' INACTIVE';
        EXECUTE STATEMENT :CADENA  WITH AUTONOMOUS TRANSACTION;
    END

end^



SET TERM ; ^

你真的有权限问题。我刚刚在一个测试数据库中测试了这个过程,效果很好。请检查您的用户和权限。以下SQL将停用触发器测试触发器:执行过程PESTADOTRIGGER('TEST\u trigger',0)