如何使用触发器插入数据

时间:2019-08-20 03:24:37

标签: sql oracle plsql ddl

我有一个关于使用触发器插入数据的问题,例如,我确实有两个表,第二个表具有属性和带有表的记录,除了另外两个属性,如下所示:

CREATE TABLE dept
( 
    DEPTNO NUMBER(3) PRIMARY KEY,
    DNAME VARCHAR2(16),
    LOC VARCHAR2(16) 
);

CREATE TABLE dept_shadow
( 
    DEPTNO  NUMBER(3) PRIMARY KEY,
    DNAME   VARCHAR2(16),
    LOC     VARCHAR2(16),
    USER    VARCHAR2(32),
    MODTIME CHAR(17)
);

我想创建一个触发器来跟踪表中的所有插入。

令人惊讶的是,我在创建表时遇到错误:

Error starting at line : 11 in command -
CREATE TABLE dept_shadow
( 
    DEPTNO  NUMBER(3) PRIMARY KEY,
    DNAME   VARCHAR2(16),
    LOC     VARCHAR2(16),
    USER    VARCHAR2(32),
    MODTIME CHAR(17)
)
Error report -
ORA-00904: : invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:

我不知道这个错误,有人可以告诉我如何通过创建触发器来完成这项工作吗?由于没有实际记录可插入!任何建议表示赞赏

2 个答案:

答案 0 :(得分:3)

好的,所以您得到的错误是因为oracle(像所有数据库一样)具有一些保留字。现在,我不确定100%,因为我不太会经常使用Oracle DB,但是由于这种原因,我认为您不能使用单词public static async Task<HttpResponseMessage> AsyncTaskIndexReport(IFileInfo file, string RepNum, string EntityType, string Domain, string Org, string EntityValue) { byte[] buf; var uri = CreateSolrURI(file, RepNum, EntityType, Domain, Org, EntityValue, out buf); ByteArrayContent byteContent = new ByteArrayContent(buf); HttpResponseMessage response = await solrClient.Value.PostAsync(uri.OriginalString, byteContent); // This line gives error response.EnsureSuccessStatusCode(); return response; } 。尝试使用private static async void IndexFileAsync(IFileInfo File, string key, string RepNum, string EntityType, string Domain, string Org, string EntityValue) { Interlocked.Increment(ref WIPAsyncIndex); logger.Info(string.Format("Solr Index - Index Started - Key Name - {0} ", key)); try { await Retry.AttemptAsync(4, RetryStrategy.Backoff, true, async () => { await SOLrWrapper.AsyncTaskIndexReport(File, RepNum, EntityType, Domain, Org, EntityValue); return true; }, null); logger.Info(string.Format("Solr Index - Index Completed - Key Name - ", key)); } catch (Exception ex) { string errorMessage = string.Format("An error occured during the indexing of {0} for {1}. The file did not index successfully. Error Details - {2}", key.Replace("%20", " "), RepNum, ex.Message); logger.Error(ex, errorMessage); DICon.Single<IErrorLogger>().LogError(ex); entitySyncTrackerEntity.SendMail("ObjectStorageProcessor Job status ", errorMessage); } finally { Interlocked.Decrement(ref WIPAsyncIndex); } } USER或类似的东西。

现在触发:

USERNAME

从那里,您可以通过:USERDESCRIPTION访问“新”数据,并通过CREATE OR REPLACE TRIGGER trg_shadow BEFORE INSERT OR UPDATE OR DELETE ON dept_shadow REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW DECLARE MODTIME char (17); BEGIN IF INSERTING THEN -- do something ELSIF UPDATING THEN -- do something ELSIF DELETING THEN -- do something END IF; 访问“旧”数据。

编辑:

NEW:OLD触发器的区别在于它们被执行且都具有有效用途时。

BEFORE触发器可用于在插入或更新之前验证数据。因此,例如,如果您不想更新在x列中否则值为0的行。

AFTER触发器可用于在插入后验证新数据。例如,如果您要删除x列中现在所有值为0的所有行。

不过,这对您来说并不重要。

希望有帮助!

答案 1 :(得分:0)

该错误是由于您在user表中使用的列名(dept_shadow)引起的。 USER是预定义的,这就是为什么它不能用作表中的列名的原因。将其重命名为“ audit_user”或您想要的任何名称(不是关键字)。它将无缝运行。

并触发

CREATE OR REPLACE TRIGGER dept_trigger
AFTER INSERT
   ON dept
   FOR EACH ROW

DECLARE
   v_username varchar2(10);

BEGIN
   -- Find username of person performing the INSERT into the table
   SELECT user INTO v_username
   FROM dual;

   -- Insert record into shadow table
   INSERT INTO dept_shadow
   ( DEPTNO,
     DNAME,
     LOC,
     AUDIT_USER,
     MODTIME )
   VALUES
   ( :new.DEPTNO,
     :new.DNAME,
     :new.LOC,
     v_username, 
     :new.MODTIME
   );
END;
/

希望这对您有用。