前幾天做了用oracle寫對錶增加,修改時的觸發器,觸發器內容為每日產生本地文字檔,檔案內容為增加、修改表的資料,以便自動上傳到伺服器上同步資料。
首先要在本地建立組建檔案的目錄,這個目錄可以設定成oracle的目錄變數對應起來,而且要用管理員帳號登入賦予對這個目錄的讀寫權限,否則會報錯,對目錄或檔案操作錯誤等資訊;然後就可以寫觸發器了,思路為如果當天沒有組建檔案,即建立檔案,並寫入檔案表頭資訊,下面緊跟著寫資料資訊,如果存在該檔案,就直接寫資料。
create or replace trigger tr_test after insert or update or delete on bd_test for each row
declare
Out_File UTL_FILE.FILE_TYPE;
DataHead varchar2(80);
--DataLine varchar2(80);
FileName varchar2(80);
--vNewLine VARCHAR2(250);
opertype varchar2(500);
msg varchar2(500);
file_exist BOOLEAN;
file_length NUMBER(10,2);
block_size BINARY_INTEGER;
begin
FileName:='JiFang_'||to_char(sysdate,'yyyy.mm.dd')||'.txt';
utl_file.fgetattr('TESTDIR',FileName,file_exist,file_length, block_size);
IF file_exist THEN
Out_File:=UTL_FILE.fopen('TESTDIR',FileName,'a');
else
Out_File:=UTL_FILE.fopen('TESTDIR',FileName,'a');--W為覆蓋
DataHead:='ID'||'名稱'||'機房位置' || '地址' ||'x座標'||'Y座標'||'操作';
IF utl_file.is_open(Out_File) THEN
UTL_FILE.put_line(Out_File,DataHead);
END IF;
END IF;
IF utl_file.is_open(Out_File) THEN
case
when inserting then
opertype:='INSERT';
msg:=:new.id||:new.MINGCHENG||:new.JIAFANGDANWEI||:new.DIZHI||:new.X||:new.Y||opertype;
when updating THEN
opertype:='UPDATE';
msg:=:new.id||:new.MINGCHENG||:new.JIAFANGDANWEI||:new.DIZHI||:new.X||:new.Y||opertype;
when DELETING THEN
opertype:='DELETE';
msg:=:old.id||:old.MINGCHENG||:old.JIAFANGDANWEI||:old.DIZHI||:old.X||:old.Y||opertype;
end case;
UTL_FILE.put_line(Out_File,msg);
END IF;
utl_file.fclose(Out_File);
end tr_test;
另外,查看和修改utl_file_dir參數命令,修改後要重新啟動資料庫。
show parameter utl_file_dir
alter system set utl_file_dir = 'D:\test' scope=spfile;
授權目錄操作許可權,管理員賬戶操作。
create or replace directory BLOBDIR as 'D:\PIC';
grant read,write on directory BLOBDIR to sharedb;
GRANT EXECUTE ON utl_file TO sharedb;
select * from ALL_DIRECTORIES;