我有一个关于使用触发器插入数据的问题,例如,我确实有两个表,第二个表具有属性和带有表的记录,除了另外两个属性,如下所示:
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:
我不知道这个错误,有人可以告诉我如何通过创建触发器来完成这项工作吗?由于没有实际记录可插入!任何建议表示赞赏
答案 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;
/
希望这对您有用。