Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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
如何将此SQL Server触发器从T-SQL迁移到PL/SQL_Sql_Oracle_Plsql - Fatal编程技术网

如何将此SQL Server触发器从T-SQL迁移到PL/SQL

如何将此SQL Server触发器从T-SQL迁移到PL/SQL,sql,oracle,plsql,Sql,Oracle,Plsql,以下内容适用于SQL Server,但我无法将其转换为PL/SQL PL/SQL: create or replace TRIGGER CHANGE_TRIGGER AFTER INSERT OR UPDATE OR DELETE ON test FOR EACH ROW BEGIN IF INSERTING THEN INSERT INTO test_LOG SELECT :NEW.* , SYSDATE, USER, 'I' FRO

以下内容适用于SQL Server,但我无法将其转换为PL/SQL

PL/SQL:

create or replace TRIGGER CHANGE_TRIGGER
  AFTER INSERT OR UPDATE OR DELETE
  ON test
  FOR EACH ROW
BEGIN
     IF INSERTING THEN
        INSERT INTO test_LOG
           SELECT :NEW.* , SYSDATE, USER, 'I' FROM DUAL;
      END IF;
END;
原始SQL Server触发器:

CREATE TRIGGER [dbo].[TRG_LOG_TEST] ON [dbo].[TEST]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @lg_name VARCHAR(128)
SELECT
@lg_name = login_name,
FROM sys.dm_exec_sessions
WHERE session_id = @@SPID
IF EXISTS (SELECT * FROM inserted)
BEGIN
INSERT INTO [TEST_LOG]
SELECT *, GETDATE(), @lg_name ,'I' from deleted
END

我认为不能用
:NEW
绑定变量引用整行。如果您引用各个列,它将起作用<代码>插入测试日志(col1,col2,col3,col4)值(:NEW.column1,SYSDATE,USER,'I')检查文档,里面有很多例子。我想写一个触发器,但是这个触发器只有一个表名。我怎么写请帮助我在Oracle,你必须按照@KoenLostrie的建议显式列出列名。我不确定触发器获取表名是什么意思,因为触发器不接受参数。也许您是说您有基于表名动态生成触发器的代码?在这种情况下,您需要查询数据字典以获取表中的列列表,以便在生成的触发器中列出列。PL/SQL和T-SQL触发器的一个关键区别是:在T-SQL中,您使用记录集,并且每个事务调用一次触发器,在PL/SQL中,处理一条记录,每行调用一次触发器。这意味着如果触发器是基本审核触发器,则不必选择触发器中的任何内容。如上所述,只需单独引用每一列——这很乏味,因此您可以编写触发器创建脚本。避免使用
*
,因为它很脆弱——表在环境之间并不总是有匹配的列顺序,所以这种构造很危险——总是使用显式的列名。我认为不能使用
:NEW
bind变量引用整行。如果您引用各个列,它将起作用<代码>插入测试日志(col1,col2,col3,col4)值(:NEW.column1,SYSDATE,USER,'I')检查文档,里面有很多例子。我想写一个触发器,但是这个触发器只有一个表名。我怎么写请帮助我在Oracle,你必须按照@KoenLostrie的建议显式列出列名。我不确定触发器获取表名是什么意思,因为触发器不接受参数。也许您是说您有基于表名动态生成触发器的代码?在这种情况下,您需要查询数据字典以获取表中的列列表,以便在生成的触发器中列出列。PL/SQL和T-SQL触发器的一个关键区别是:在T-SQL中,您使用记录集,并且每个事务调用一次触发器,在PL/SQL中,处理一条记录,每行调用一次触发器。这意味着如果触发器是基本审核触发器,则不必选择触发器中的任何内容。如上所述,只需单独引用每一列——这很乏味,因此您可以编写触发器创建脚本。避免使用
*
,因为它很脆弱——表在环境之间并不总是有匹配的列顺序,所以这样的构造很危险——总是使用显式的列名。