среда, 30 января 2013 г.

Master Note For Oracle Database Server Installation [ID 1156586.1]

Certification

For the latest Database Certification always refer to My Oracle Support (MOS) Certify.

At the same time the documentation listed below assists in understanding the Oracle Database Certification:
Note 1298096.1 Master Note For Database and Client Certification
Note 161818.1 Oracle Database (RDBMS) Releases Support Status Summary
Note 207303.1 Client / Server / Interoperability Support Between Different Oracle Versions
Note 1307745.1 Oracle Database Support on the Itanium Processor Architecture
Note 464754.1 Certified Software on Oracle VM
Note 1306539.1 Core Oracle Database Certification Information

Installation Guides

Oracle Database documentation, 11g Release 2 (11.2)
Installation manuals and platform-specific books are included in this link.

Oracle Database documentation, 11g Release 1 (11.1)
Installation manuals and platform-specific books are included in this link.

Oracle Database documentation, 10g Release 2 (10.2)
Installation manuals and platform-specific books are included in this link.

Oracle Database documentation, 10g Release 1 (10.1)
Installation manuals and platform-specific books are included in this link.

Oracle9i documentation, Release 2 (9.2)
Installation manuals and platform-specific books are included in this link

Oracle9i documentation, Release 1 (9.0.1)
Installation manuals and platform-specific books are included in this link

OS General Information and Known Issues

Most of the installation and relinking issues appear if you don't satisfy the minimum requirements for the installation. Therefore if you are raising any SR for installation issue it is better to ensure that you have all these requirements mentioned in the below articles before raising the SR.
The documentation listed below help you in understanding the OS Requirements for Oracle Database Installation:
Generic
Solaris
Linux
AIX
HP
WINDOWS

Generic

General
Note 1351051.1 Information Center: Install and Configure Database Server/Client InstallationsNote 1476075.1 FAQ on downloading 9i, 10g, 11g software
Note 169706.1 Oracle Database on Unix AIX,HP-UX,Linux,Mac OS X,Solaris,Tru64 Unix Operating Systems Installation and Configuration Requirements Quick Reference (8.0.5 to 11.2)
Note 1360790.1 Roadmap of Oracle Database Patchset Releases
Note 458893.1 Oracle Universal Installer (OUI) FAQ
Note 403212.1 Location Of Logs For OPatch And OUI
Note 454442.1 11g Install : Understanding about Oracle Base, Oracle Home and Oracle Central/Global Inventory locations
Note 1467060.1 Relinking Oracle Home FAQ ( Frequently Asked Questions)
Note 131321.1 How to Relink Oracle Database Software on UNIX
Note 883299.1 Oracle 11gR2 Relink New Feature
Note 444595.1 Is It Necessary To Relink Oracle Following OS Upgrade?
Note 556834.1 Steps To Recreate Central Inventory(oraInventory) In RDBMS Homes
Note 750540.1 What are the requirements for an Oracle Home Name in the Inventory?
Note 881063.1 Key RDBMS Install Differences in 11gR2
Note 884232.1 11gR2 Install (Non-RAC): Understanding New Changes With All New 11.2 Installer
Note 948061.1 How to Check and Enable/Disable Oracle Binary Options
Note 429074.1 Can You Run Different Releases Of The Oracle Database On The Same Computer At The Same Time?
Note 389678.1 Are Compilers Necessary for Oracle RDBMS Installation?
Note 401332.1 How To Identify A Server Which Has Itanium2 (Montecito, Montvale, Tukwila....) Processors Installed
Note 400227.1 How To Install Oracle RDBMS Software On Itanium Servers With Montecito Processors
Note 1474891.1 Is It Supported to Change Uid/Gid Of Oracle Database Software Owner After Installation?
Note 1469625.1 Can root.sh Be Run While Standalone Database Instances Are Up And Running?
Note 1475077.1 Can the $ORACLE_HOME/jdk and $ORACLE_HOME/jdk/jre Directories Be Removed?
Note 1449674.1 Is It Supported to Update /Upgrade the Default JDK/JRE in Oracle Home?
Note 1429678.1 How to interpret OS system traces
Known Issues Generic
Note 468771.1 Installing 11G on Any Platform : File Not Found Errors Running RunInstaller/Setup.exe
Note 883702.1 $ORACLE_HOME/lib32 does not exist in Oracle database 11gR2. Why?
Note 1245784.1 Installing Component using Installer from 11.2 ORACLE_HOME Fails with OUI-10150
Note 1091063.1 sqlplus /nolog is failing with errors : SP2-1503 SP2-0152
Note 1207849.1 Install Error: String Index Out Of Range: -1 Error Messages
Note 1325924.1 INS-32025 while installing 11.2 examples
Note 1367658.1 11.2 OUI does not use the $TEMP variable for CV_DESTLOC during a single instance installation
Note 1307782.1 Oracle 11.2 Installation Fails If OS Users Password Contains '%'
Note 1162824.1 Installing Oracle 10.2.0.1 On AIX Hangs At Prereqs Check
Note 1127135.1[INS-00001] Unknown irrecoverable error installing 11.2
Note 744512.1 Ora-12547: Tns:Lost Contact Creating Database After Clean Installation
Note 763143.1 Explanation and Options To Handle "Checking operating system version: must be ... Failed" OUI errors
Note 1268391.1 Installing 11gR2 Fails With [INS-30060] Check For Group Existence Failed
Note 1301113.1 "Invalid Entry Size" Error During Oracle Database Installation
Note 1471777.1 11.2.0.3 OUI Screen Not Coming Up Through Xmanager (Exceed)
Note 1475425.1 Oracle Universal Installer - Make issue While Installing 11gR2 Database
Note 1478832.1 Instaling 11.2 fails with error Error in invoking target 'rat_on part_on dm_on olap_on sdo_on' of makefile and echodo: Execute permission denied.
Note 1475482.1 ./runInstaller results in: [FATAL] [INS-32012] Unable to create directory:
Note 1489892.1 OUI Screen Disconnected Before Prompts To Run Scripts As 'Root' User Have Been Responded
Note 1474762.1 WARNING:OUI-67200:Make failed to invoke "/usr/ccs/bin/make -f ins_rdbms.mk ioracle ORACLE_HOME="....'ld: fatal: file //lib/prod/lib/v9/crti.o: open failed: Permission denied
Note 1511859.1 OUI:Attachhome fails with the Error "SEVERE: Abnormal program termination. An internal error has occured.  "Please provide the following files to Oracle Support"

Solaris 

General
Note 1307041.1 Certification Information for Oracle Database on Solaris SPARC 64
Note 1307389.1 Certification Information for Oracle Database on Oracle Solaris x86-64
Note 743042.1 Requirements for Installing Oracle 11gR1 RDBMS on Solaris 10 SPARC 64-bit
Note 971464.1 FAQ - 11gR2 requires Solaris 10 update 6 or greater
Note 964976.1 Requirements for Installing Oracle 11gR2 RDBMS on Solaris 10 SPARC
Note 429191.1 Kernel setup for Solaris 10 using project files
Note 317257.1 Running Oracle Database in Solaris 10 Containers - Best Practices
Known Issues on Solaris
Note 848700.1 11gR1 on Solaris failing at relink phase with errors like "ld fatal relocation error" and then "ld fatal library -lclntsh not found"
Note 966929.1 11gR2 INSTALL ERRORS on Solaris 10
Note 989727.1 11GR2 INSTALL ON SOLARIS FAILS MANY PREREQUISITE CHECKS
Note 969497.1 During An 11gR2 (11.2) Installation On Solaris, OUI Performs A Prerequisite Check For The Optional Patch 124861-15 And Fails If It Is Not Installed
Note 1325973.1 [INS-30060] Check for group existence failed - While installing 11gR2 on Solaris
Note 1477021.1 make: Fatal error: Command failed for target $ORACLE_HOME/precomp/lib/proc
Note 1471229.1 Installation of Oracle 11gR2 fails while checking for runlevel
Note 1477327.1 ROOT.SH Errors with mkdir: "/usr/local/bin": Read-only file system Solaris Container
Note 1446945.1 ld: warning: symbol `_start' has differing types: While Installing Or Patching 11gR2 On Oracle Solaris Platform

Linux

General
ORACLE Validated Configurations
Note 1307056.1 Certification Information for Oracle Database on Linux x86
Note 1304727.1 Certification Information for Oracle Database on Linux x86-64
Note 851598.1 Master Note of Linux OS Requirements for Database Server
Note 376183.1 Defining a "default RPMs" installation of the RHEL OS
Note 386391.1 Defining a "default RPMs" installation of the SLES OS
Note 401167.1 Defining a "default RPMs" installation of the Oracle Enterprise Linux (OEL) OS
Note 728346.1 Linux OS Installation with Reduced Set of Packages for Running Oracle Database Server
Note 1508516.1 Is It Mandatory To Install UEK Kernel Under RHEL?
Note 266043.1 Support of Linux and Oracle Products on Linux
Note 787705.1 How to identify correct Oracle Database software to install on Linux platform
Note 1075717.1 Installing 32-bit RDBMS Client software on x86_64 Linux.
Note 1315914.1 Install 11gr2 On Sles11 - Packages Required Not Mentioned In Installation Guide
Note 1350000.1 Database Client or Database Server Install on Red Hat 6 (RHEL6)
Note 444084.1 Multiple gcc / g++ Versions in Linux
Note 567506.1 Maximum SHMMAX values for Linux x86 and x86-64
Note 761261.1 Recommended metalink articles for Oracle Database 10gR2 installation on zLinux (s390x)
Note 415182.1 DB Install Requirements Quick Reference - zSeries based Linux
Note 341507.1 Oracle Database Server on Linux on IBM POWER
Note 786995.1 Troubleshooting The Relink Errors When Missing RPMs on Linux x86-64
Note 377217.1 What should the value of LD_ASSUME_KERNEL be set to for Linux?
Known Issues On Linux
Note 308788.1 While Installing Oracle Database on SUSE SLESx x86-64 Linking Errors Occur and NetCA/DBCA Fail With Error: UnsatisfiedLinkError exception loading native library: njni10
Note 317627.1 Error in invoking target 'agent emsubagent nmo nmb' of makefile '$ORACLE_HOME/sysman/lib/ins_sysman.mk'
Note 362285.1 Error in Invoking Target 'Install' of Makefile $ORACLE_HOME/ctx/lib/ins_ctx.mk
Note 468977.1 UnsatisfiedLinkError exception loading native library: njni11
Note 1063952.1 11gR2 Database Server install fails with [INS-13001] Environment does not meet minimum requirements
Note 1220843.1 Getting __stack_chk_fail@GLIBC_2.4 makefile errors during Oracle 11.2 Install on Linux
Note 1313504.1 Error in invoking 'ntcontab.o' of makefile while installaing 11gr2 client on Linux x86-64 bit server
Note 1073332.1 /usr/bin/ld: Cannot Find -lxml11, Genclntsh: Failed To Link libclntsh.so.11.1
Note 460969.1 /usr/bin/ld: Cannot Find -lxml10, Genclntsh: Failed To Link Libclntsh.so.10.1
Note 443617.1 "Exception java.lang.UnsatisfiedLinkError: ../jre/1.4.2/lib/i386/libawt.so: libXp.so.6: cannot open shared object file: No such file or directory occurred" on RHEL5/OEL5 for 10.2 x86 or x86_64 install
Note 301830.1 Upon startup of Linux database get ORA-27102: out of memory Linux-X86_64 Error: 28: No space left on device
Note 454196.1 ./sqlplus: error on libnnz11.so: cannot restore segment prot after reloc
Note 1454982.1 Installing 11.2.0.3 32-bit (x86) or 64-bit (x86-64) on RHEL6 Reports That Packages "elfutils-libelf-devel-0.97" and "pdksh-5.2.14" are missing (PRVF-7532)

AIX

General
Note 1307544.1 Certification Information for Oracle Database on IBM AIX on Power systems
Note 282036.1 Minimum Software Versions and Patches Required to Support Oracle Products on IBM Power Systems
Note 889464.1 Is Oracle 10g And 11g Database Compatible With AIX Version 6.1
Note 417451.1 How To Determine Whether an APAR has been Fixed in AIX Version/Maintenance Level
Note 739963.1 Using AIX commands genld, genkld and slibclean to avoid library file locking errors(libjox)
Note 458403.1 Why AIXTHREAD_SCOPE should be set to 'S' on AIX
Note 201622.1 Is It Still NecessaryTto Run the Rootpre.sh Script When Installing Oracle on AIX 5L and above?
Note 753601.1 SUPPORT FOR ORACLE DATABASE ON WPARS UNDER AIX 6.1
Known Issues On AIX
Note 832074.1 AIX 6.1 "Dependent module /usr/lib/libXpm.a(shr_64.o) could not be loaded" Error Attempting To Execute 11.1.0 runInstaller
Note 879102.1 Stand Alone 11.1.0.6 Silent Installation on AIX 5.3 Fails On Prerequisite Check For rsct.basic.rte(0.0) and rsct.compat.clients.rte(0.0)
Note 1439940.1 11gR2 OUI On AIX Pre-Requisite Check Gives Error "Patch IZ97457, IZ89165 Are Missing"
Note 980602.1 The Installer (OUI) Detects Processes Running on ORACLE_HOME on AIX 6.1 TL04 SP1
Note 985563.1 AIX: ERROR IN INVOKING TARGET 'LINKS PROC GEN_PCSCFG' OF MAKEFILE, ld: 0711-593 SEVERE ERROR: Symbol C_BSTAT
Note 1327608.1 INS-13001 Environment does not meet minimum requirements when installing 11.2.0.2 on AIX 7.1
Note 859842.1 Database Server Installation on AIX 6.1 Error: OUI-18001: 'AIX Version 6100.01' is not supported
Note 1364239.1 runInstaller Failed With "OUI: 0403-006 Execute permission denied" While Installing 11.2.0.x On AIX
Note 1506934.1 Oracle 11gR2 Install : Executing rootpre.sh fails with the error cldomain: file not found

HP

General
Note 1307026.1 Certification Information for Oracle Database on HP-UX PA-RISC Platform
Note 1307745.1 Oracle Database Support on the Itanium Processor Architecture
Known Issues on HP
Note 725913.1 Error OUI-15038 At Pre-Requisite Check Stage During Oracle 11g Install
Note 1183545.1 OUI 10.2.0.4 and OUI 10.2.0.5 raise OUI-15038 "Unable to execute rule 'CheckCompatibility' .. [For input string: "11_11"]
Note 471476.1 32 Bit Libraries Are Not Installed With Oracle11g (11.1.0.6) On HP-UX Itanium
Note 287428.1 Oracle Universal Installer has detected that there are processes running in the currently selected
Note 819394.1 HP-UX: Sqlplus: ORA-12549: TNS:operating system resource quota exceeded
Note 1194973.1 Failure On Prerequisite Checks For 11gR2 Installation on HP-UX
Note 552358.1 Installation Of Oracle 10.2 Client Fails On HPUX Itanium Servers With Montecito Processors

WINDOWS

General
Note 1307189.1 Certification Information for Oracle Database on Microsoft Windows x86 (32-bit)
Note 1307195.1 Certification Information for Oracle Database on Microsoft Windows
Note 952302.1 Is Microsoft Windows 7 certified to install/run Oracle Database Server/Client ?
Note 443813.1 Check List For Oracle On Windows.
Note 137200.1 Checklist when Oracle Universal Installer (OUI) fails for Windows
Note 436299.1 Common reasons for OUI failures on the MS Windows platforms
Note 161549.1 Oracle Database Server and Networking Patches for Microsoft Platforms
Note 816893.1 How to Recreate the Windows Registry for Oracle, After reloading the Windows OS
Note 432713.1 How To Create a Service using oradim in Windows Vista
Note 1449665.1 How To Disable/Enable A Specific Component From A 11.1.0.7 Database Home On Windows Platforms
Note 870253.1 32-bit Client Install on 64-bit Windows Platform
Note 1151394.1 Running 32-bit and 64-bit Oracle Software On 64-bit Windows
Note 208256.1 WIN: How to Remove a Single ORACLE_HOME and Its Traces on Microsoft Windows Platforms
Note 124353.1 Manually Removing all Oracle Components on Microsoft Windows Platforms
Note 1069034.1 11.2: How to Manually Remove Oracle Server Software on Microsoft Windows Platforms
Note 1433144.1 What Is The Windows Service "Oracleremexecservice" ?
Known Issues on Windows
Note 1292921.1 While Installing 11.2, OUI Fails With "Error in starting the service. The service OracleMTSRecoveryService was not found"
Note 221545.1 Oracle Installation Issues in Windows Platforms
Note 418479.1 file in use Errors, when applying patches on Windows
Note 271569.1 Database creation using DBCA on WIN 2003 PDC fails with DIM-19
Note 334528.1 ORA-12154 or ORA-6413 Running 32-bit Oracle Software on 64-bit
Note 1133495.1 Installation of 11gR2 on Windows Fails Checking Requirements
Note 1088324.1 11gR2 Deinstall fails on Windows 7
Note 1468882.1 Oracle Universal Installer Hangs While Installing Oracle 11g Client/Database On Windows
Note 958591.1 Oracle Install Crashed With Java Error in Windows Environment

Scripts

Note.189256.1 UNIX Script to Verify Installation Requirements for Oracle 8.0.5 to 9.2 versions of RDBMS
Note 250262.1 RDA 4 - Health Check / Validation Engine Guide (Doc ID 250262.1)

Silent Install

Note 136660.1 Working Response files for a silent install of Oracle Server on MS-Windows- Part 1 of 3
Note 136661.1 Database Configuration Response file for performing silent install - Part 2 of 3
Note 136662.1 Network Configuration Reponse file for performing silent install - Part 3 of 3
Note 388451.1 How to create a Response File for Silent Installation?
Note 434315.1 How Can You Install Oracle Without Using The Oracle Universal Installer( runInstaller) GUI and Xserver especially When Doing A Remote Installation ?
Note 405124.1 How to Prevent a Silent Install from Prompting for User Input to Run the 'root.sh' Script
Note 808275.1 How to install Oracle Database Patchset software in Silent mode without using response file
Note 782919.1 How to install Oracle Database Server software silently with customized listener configuration
Note 885643.1 How to install 11gR2 Database/Client Software in Silent mode without using response file
Note 782918.1 How to install/deinstall Oracle Database Server software silently without response file
Note 782923.1 How to install/deinstall Oracle Database Client software silently without response file
Note 435680.1 Response File Installation of Database Server 10.2 (Suppressed or Silent mode)

Deinstall/Removing Installations

General Information
Note 208116.1 How to remove all traces of ORACLE_HOME on UNIX
Note 275493.1 Removing 10g Database and Software from AIX, HP-UX, Linux, Sun and Tru64 Platforms
Note 1363753.1 Behaviour of the Oracle De-install/Deinstall/Uninstall Utility in 11gR2
Note 886749.1 Oracle 11gR2 Deinstall And Deconfig Tool Options
Note 883743.1 How To Deinstall/Uninstall Oracle Home In 11gR2
Note 1070610.1 How To De-install Oracle Home Using runinstaller
Note 435219.1 How To Clean Up The Inventory After Deleting The Oracle Home Manualy Using OS Commands("rm-rf " or other)?
Note 888934.1 Is it possible to deinstall/remove a specific component from already installed Oracle Database Home using OUI?
Note 1271072.1 Is it possible to deinstall/disable a specific licensable option from already installed Oracle Database 11gR2 Home ?
Known Problems
Note 885609.1 11gR2 OUI warning: Please run the command '/deinstall/deinstall' to deinstall this OracleHome
Note 1069028.1 Deinstall utility on 11.2 removes multiple ORACLE_HOMEs
Note 1271661.1 Deinstall 11.2 32-bit Home Inadvertanly Removes 64-bit Homes and Vice Versa
Note 1067622.1 11.2 DEINSTALLER REMOVING LISTENERS RUNNING FROM OTHER ORACLE_HOMES
Note 1322509.1 11.2 Database Corrupted After Use of $ORACLE_HOME/deinstall/deinstall Script
Note 753929.1 Errors During Silent 11.1.0.6 Deinstallation
Note 1128464.1 Uninstall Of Oracle 11gR2 Home On Windows Does Not Recognize Non-English Response
Note 1374044.1 When deinstalling 11gR1 ,OUI greyed out the Remove button and getting message - You cannot deinstall at this time.

Diagnostic Tools

Note 780551.1 How To Diagnose Linking Errors During Base Install of Oracle RDBMS
Note 757964.1 Oracle Universal Installer ( OUI ) Error Messages and Solution Reference List
Note 1812.1 TECH: Getting a Stack Trace from a CORE file

General Information

Note.738771.1 How to Log Good Service Request for Relink issues?
Note.736819.1 How to Log Good Service Request for Oracle Universal Installer (OUI) issues?

Using My Oracle Support Effectively

Note 868955.1 My Oracle Support Health Checks Catalog
Note 166650.1 Working Effectively With Global Customer Support
Note 199389.1 Escalating Service Requests with Oracle Support Services

Generic Links

Note 1351051.1 Information Center: Install and Configure Database Server/Client Installations
Note 1194734.1 Where do I find that on My Oracle Support (MOS) [Video]
Note 742060.1 Release Schedule of Current Database Releases
Note 1476075.1 FAQ: Downloading 9i, 10g, and 11g database software media
Note 549617.1 How To Verify The Integrity Of A Patch/Software Download? [Video]
Note 268895.1 Oracle Database Server Patchset Information, Versions: 8.1. 7 to 11.2.0
Note 783141.1 Reference List of Critical Patch Update Availability(CPU) and Patch Set Update (PSU) Documents For Oracle Database and Fusion Middleware Product
Note 1119703.1 Database PSU-CPU Cross-Reference List
Note 854428.1 Patch Set Updates for Oracle Products
Note 1061295.1 Patch Set Updates - One-off Patch Conflict Resolution
Information on Security Patch Updates (SPU's)

The window below is a live discussion of this article (not a screenshot).  We encourage you to join the discussion by clicking the "Reply" link below for the entry you would like to provide feedback on.  If you have questions or implementation issues with the information in the article above, please share that below.


References

NOTE:1157464.1 - Master Note on Oracle Universal Installer (OUI) for installing Oracle Database Software
NOTE:1351051.2 - Information Center: Install and Configure Database Server/Client Installations
NOTE:1157463.1 - Master Note For Oracle Database Client Installation

пятница, 25 января 2013 г.

Настройка аудита Oracle



ALTER system SET audit_sys_operations=TRUE scope=spfile;
ALTER system SET audit_trail=db_extended scope=spfile;


shutdown immediate;
startup


BEGIN
  DBMS_AUDIT_MGMT.INIT_CLEANUP(
    AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
    DEFAULT_CLEANUP_INTERVAL => 24
  );
END;
/
commit;



CREATE TABLESPACE "AUDIT_DATA" DATAFILE SIZE 314572800 AUTOEXTEND ON NEXT 104857600 MAXSIZE 29696M;


BEGIN
  DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION(
    AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
    AUDIT_TRAIL_LOCATION_VALUE => 'AUDIT_DATA'
  );
END;
/
commit;



BEGIN
  DBMS_SCHEDULER.CREATE_JOB (
    job_name   => 'DAILY_AUDIT_ARCHIVE_TIMESTAMP',
    job_type   => 'PLSQL_BLOCK',
    job_action => 'BEGIN DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
                                                                    LAST_ARCHIVE_TIME => sysdate-1); END;',
    start_date => sysdate,
    repeat_interval => 'FREQ=HOURLY;INTERVAL=24',
    enabled    =>  TRUE,
    comments   => 'Create an archive timestamp'
  );
END;
/

Create daily purge job:
BEGIN
  DBMS_AUDIT_MGMT.CREATE_PURGE_JOB(
    AUDIT_TRAIL_TYPE           => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
    AUDIT_TRAIL_PURGE_INTERVAL => 24,
    AUDIT_TRAIL_PURGE_NAME     => 'Daily_Audit_Purge_Job',
    USE_LAST_ARCH_TIMESTAMP    => TRUE
  );
END;
/
commit;

Руками аудит можно удалить так:

BEGIN
  DBMS_AUDIT_MGMT.clean_audit_trail(
   audit_trail_type        => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
   use_last_arch_timestamp => TRUE);
END;
/

Просмотр настроек  аудита:

SELECT PARAMETER_NAME, PARAMETER_VALUE, AUDIT_TRAIL
 FROM DBA_AUDIT_MGMT_CONFIG_PARAMS
 WHERE audit_trail = 'STANDARD AUDIT TRAIL';

SELECT owner,segment_name,tablespace_name
 FROM dba_segments
 WHERE segment_name ='AUD$';


SELECT  * FROM DBA_STMT_AUDIT_OPTS;

SELECT * FROM DBA_PRIV_AUDIT_OPTS;

SELECT * FROM DBA_OBJ_AUDIT_OPTS;

SELECT JOB_NAME,JOB_STATUS,AUDIT_TRAIL,JOB_FREQUENCY FROM DBA_AUDIT_MGMT_CLEANUP_JOBS;

SELECT job_name, next_run_date, state, enabled FROM dba_scheduler_jobs WHERE job_name LIKE '%AUDIT%';


Просмотр данных  аудита:

select * from  sys.aud$        
select * from  DBA_AUDIT_TRAIL


select * from  DBA_AUDIT_EXISTS  

select * from  DBA_AUDIT_OBJECT  

select * from  DBA_AUDIT_SESSION 

select * from  DBA_AUDIT_STATEMENT

Активность пользователей

select username, to_char(logoff_time,'mm/dd') ts,
sum(logoff_lread) lread,
sum(logoff_pread) pread,
sum(logoff_lwrite) lwrite,
sum(session_cpu) scpu
from dba_audit_trail
where logoff_time between TO_DATE('01.01.2013:00:00:00','DD.MM.YYYY:HH24:MI:SS')
                      and TO_DATE('30.01.2013:23:59:59','DD.MM.YYYY:HH24:MI:SS')
group by username, to_char(logoff_time,'mm/dd')
order by username, to_char(logoff_time,'mm/dd')


CPU Usage

select username, to_char(logoff_time,'mm/dd') ts,
count(1) cnt,
sum(session_cpu) sum_cpu, avg(session_cpu) avg_cpu,
min(session_cpu) min_cpu, max(session_cpu) max_cpu
from dba_audit_trail
where logoff_time between TO_DATE('01.01.2013:00:00:00','DD.MM.YYYY:HH24:MI:SS')
                      and TO_DATE('30.01.2013:23:59:59','DD.MM.YYYY:HH24:MI:SS')
group by username, to_char(logoff_time,'mm/dd')
order by username, to_char(logoff_time,'mm/dd')


Trace Account Locks

select to_char(timestamp,'mm/dd/yy hh24:mi') ts,
os_username, userhost, returncode
from dba_audit_trail
--where username = 'SCOTT'
order by timestamp;


0     - ok
1017  - wrong password
28000 - account locked
.....

List  audit information:

SELECT USERNAME, LOGOFF_TIME, LOGOFF_LREAD, LOGOFF_PREAD, LOGOFF_LWRITE, LOGOFF_DLOCK
    FROM DBA_AUDIT_SESSION;


SELECT username, extended_timestamp, owner, obj_name, action_name,   ses_actions,
      DECODE (ses_actions,
              '---S------------', 'DELETE',
              '------S---------', 'INSERT',
              '----------S-----', 'UPDATE',
              '------------S---', 'EXECUTE',
              '---------S------', 'SELECT',
              'S----------------','ALTER'
      ) transactions
FROM dba_audit_trail
WHERE
      TO_CHAR(extended_timestamp, 'DD.MM.YYYY:HH24:MI:SS') >= '01.01.2013:00:00:00'
  AND TO_CHAR(extended_timestamp, 'DD.MM.YYYY:HH24:MI:SS') <= '30.01.2013:23:59:59'
  AND username NOT IN ('SYS', 'SYSTEM', 'DBSNMP', 'EXFSYS')
ORDER BY extended_timestamp DESC;


select spare1           /* OS_USERNAME */,
       userid               /* USERNAME */,
       userhost           /* USERHOST */,
       terminal            /* TERMINAL */,
       to_char(cast (          
           (from_tz(aud.ntimestamp#,'00:00') at local) as date),'mm/dd/yy hh24:mi') ts,
       obj$creator      /* OWNER */,
       obj$name         /* OBJECT_NAME */,
       aud.action#      /* ACTION */,
       act.name          /* ACTION_NAME */
from sys.aud$ aud, system_privilege_map spm, system_privilege_map spx,
     STMT_AUDIT_OPTION_MAP aom, audit_actions act
where   aud.action#     = act.action    (+)
  and - aud.logoff$dead = spm.privilege (+)
  and   aud.logoff$dead = aom.option#   (+)
  and - aud.priv$used   = spx.privilege (+)
  -- and   userid = 'SCOTT'
  -- and act.name = 'ALTER USER'
  and aud.ntimestamp# between TO_DATE('01.01.2013:00:00:00','DD.MM.YYYY:HH24:MI:SS')
                          and TO_DATE('31.07.2013:23:59:59','DD.MM.YYYY:HH24:MI:SS')
order by ts;



Создаем пользователей для системы ARCSIGHT:


-- Run from user SYSTEM:

-- :
create user arcsight identified by "*****";
grant create session to ARCSIGHT;


-- :
create user ARCSIGHT_PRIV identified by "*****";
grant create session to ARCSIGHT_PRIV;
grant create view to ARCSIGHT_PRIV;



Предоставим доступ к словарю БД пользователю  ARCSIGHT:

-- Run from user SYS:
grant select on sys.dba_common_audit_trail to ARCSIGHT_PRIV with grant option;
grant select on sys.v_$instance            to ARCSIGHT_PRIV with grant option;
grant select on sys.v_$session             to ARCSIGHT_PRIV with grant option;
grant select on sys.user$                  to ARCSIGHT_PRIV with grant option;


Создаем представление:

-- Run from user ARCSIGHT_PRIV;
create or replace view ARCSIGHT_PRIV.AUDIT_ALL as
SELECT
  dba_common_audit_trail.AUDIT_TYPE       as AUDIT_TYPE,
  dba_common_audit_trail.SESSION_ID       as SID,
  dba_common_audit_trail.PROXY_SESSIONID  as PROXY_SESSIONID,
  dba_common_audit_trail.STATEMENTID      as STATEMENTID,
  dba_common_audit_trail.ENTRYID          as ENTRYID,
  cast (dba_common_audit_trail.EXTENDED_TIMESTAMP as date) as EXTENDED_TIMESTAMP,
  dba_common_audit_trail.GLOBAL_UID       as GLOBAL_UID,
  dba_common_audit_trail.DB_USER          as USERNAME,
  dba_common_audit_trail.CLIENT_ID        as CLIENT_ID,
  dba_common_audit_trail.EXT_NAME         as EXT_NAME,
  dba_common_audit_trail.OS_USER          as OS_USERNAME,
  dba_common_audit_trail.USERHOST         as USERHOST,
  dba_common_audit_trail.OS_PROCESS       as OS_PROCESS,
  dba_common_audit_trail.TERMINAL         as TERMINAL,
  dba_common_audit_trail.INSTANCE_NUMBER  as INSTANCE_NUMBER,
  dba_common_audit_trail.OBJECT_SCHEMA    as OBJECT_SCHEMA,
  dba_common_audit_trail.OBJECT_NAME      as OBJECT_NAME,
  dba_common_audit_trail.ACTION           as ACTION,
  dba_common_audit_trail.STATEMENT_TYPE   as ACTION_NAME,
  dba_common_audit_trail.RETURNCODE       as RETURNCODE,
  dba_common_audit_trail.SCN              as SCN,
  dba_common_audit_trail.COMMENT_TEXT     as COMMENT_TEXT,
  dba_common_audit_trail.SQL_TEXT         as SQL_TEXT,
  dba_common_audit_trail.OBJ_PRIVILEGE    as OBJ_PRIVILEGE,
  dba_common_audit_trail.ADMIN_OPTION     as ADMIN_OPTION,
  dba_common_audit_trail.OS_PRIVILEGE     as OS_PRIVILEGE,
  dba_common_audit_trail.GRANTEE          as GRANTEE,
  dba_common_audit_trail.PRIV_USED        as PRIV_USED,
  dba_common_audit_trail.SES_ACTIONS      as SES_ACTIONS,
  v$session.PROGRAM                       as PROGRAM,
  V$Instance.HOST_NAME                    as HOST_NAME,
  V$Instance.VERSION                      as VERSION,
  V$Instance.INSTANCE_NAME                as INSTANCE_NAME
   FROM  dba_common_audit_trail, V$Instance, V$session
WHERE V$session.AUDSID(+)=dba_common_audit_trail.SESSION_ID
  and (
    (dba_common_audit_trail.ACTION = 100 and dba_common_audit_trail.RETURNCODE <> 0)
    OR
    (dba_common_audit_trail.ACTION <> 100 and dba_common_audit_trail.AUDIT_TYPE<>'Mandatory XML Audit')
  )
  union all
  SELECT v$session.type || ' Audit' as AUDIT_TYPE,
       v$session.AUDSID as SID, null,null,null,
               cast (v$session.LOGON_TIME as date) as EXTENDED_TIMESTAMP, null,
               v$session.USERNAME, null,null,
               v$session.OSUSER as OS_USERNAME,
               v$session.MACHINE as USERHOST,
               null,
               v$session.TERMINAL, null,
               v$session.SCHEMANAME as OBJECT_SCHEMA,
               null,100,'Succesful_Logon',0,null,
               v$session.event as COMMENT_TEXT,
               null,null,null,null,null,null,null,
               v$session.PROGRAM as PROGRAM,
               V$Instance.HOST_NAME,
               V$Instance.VERSION,
               V$Instance.INSTANCE_NAME
   FROM        v$session, v$instance
/

grant select on ARCSIGHT_PRIV.AUDIT_ALL to ARCSIGHT;



Проверяем работу представления под пользователем  ARCSIGHT:

-- Run from user ARCSIGHT:
select *
from ARCSIGHT_PRIV.AUDIT_ALL;


Можем еще создать дополнительные представления:

-- Run from user ARCSIGHT_PRIV;
create or replace view ARCSIGHT_PRIV.AUDIT_PWD as
select name, ctime, ltime, ptime, exptime from sys.user$;

grant select on ARCSIGHT_PRIV.AUDIT_PWD to ARCSIGHT;


-- Run from user ARCSIGHT:
select *
from ARCSIGHT_PRIV.AUDIT_PWD;




Очистка аудита:


# Clean system audit
06 04 * * * ${HOME}/bin/pkg/clean_sys_audit/_run.sh 1 > /dev/null 2>> /tmp/crontab_oracle.err



$more _run.sh

#!/bin/bash


#
# Package Name:
#

tmp_string="`dirname $0`"
pkg_name="`basename ${tmp_string}`"

if [ "${pkg_name}" = "." ]; then
  tmp_string="`pwd`"
  pkg_name="`basename ${tmp_string}`"
fi



# Check Parameters:
if [ $1 ]; then
  retention_period=$1
else
  echo "`date +%Y.%m.%d" "%H:%M:%S` - ${pkg_name}: Error! (Parameter=2). Call `basename $0` " >&2
  exit 2
fi


#
# Setup Environment:
#

pkg_env="${HOME}/bin/_conf/.env"
if [ ! -r "${pkg_env}" ]; then
  echo "`date +%Y.%m.%d" "%H:%M:%S` - ${pkg_name}: ERROR!!! Execution Aborted. Not Found Environment file: ${pkg_env}" >&2
  exit 2
fi

if [ -s "${pkg_env}" ]; then
  . ${pkg_env}
else
  echo "`date +%Y.%m.%d" "%H:%M:%S` - ${pkg_name}: ERROR!!! Execution Aborted. Environment file is empty: ${pkg_env}" >&2
  exit 2
fi


#
# Check Environment:
#

# Check ORACLE_USER:
if [ -z "${ORA_USER}" ]; then
  echo "`date +%Y.%m.%d" "%H:%M:%S` - ${pkg_name}: ERROR!!! Execution Aborted. Environment variable ORA_USER not defined" >&2
  exit 2
else
  ora_user=${ORA_USER}
fi


# Check ORACLE_BASE:
if [ -z "${ORACLE_BASE}" ]; then
  echo "`date +%Y.%m.%d" "%H:%M:%S` - ${pkg_name}: ERROR!!! Execution Aborted. Environment variable ORACLE_BASE not defined" >&2
  exit 2
else
  oracle_base=${ORACLE_BASE}
fi


# Check ORACLE_HOME:
if [ -z "${ORACLE_HOME}" ]; then
  echo "`date +%Y.%m.%d" "%H:%M:%S` - ${pkg_name}: ERROR!!! Execution Aborted. Environment variable ORACLE_HOME not defined" >&2
  exit 2
elif [ ! -d "${ORACLE_HOME}" ]; then
  echo "`date +%Y.%m.%d" "%H:%M:%S` - ${pkg_name}: ERROR!!! Execution Aborted. Directory ORACLE_HOME not found (${ORACLE_HOME})" >&2
  exit 2
fi


# Check TMP_DIR:
if [ -z "${TMP_DIR}" ]; then
  echo "`date +%Y.%m.%d" "%H:%M:%S` - ${pkg_name}: ERROR!!! Execution Aborted. Environment variable TMP_DIR not defined" >&2
  exit 2
elif [ ! -d "${TMP_DIR}" ]; then
  echo "`date +%Y.%m.%d" "%H:%M:%S` - ${pkg_name}: ERROR!!! Execution Aborted. Directory TMP_DIR not found (${TMP_DIR})" >&2
  exit 2
elif [ ! -w "${TMP_DIR}" ]; then
  echo "`date +%Y.%m.%d" "%H:%M:%S` - ${pkg_name}: ERROR!!! Execution Aborted. Directory TMP_DIR not writeable (${TMP_DIR})" >&2
  exit 2
fi


# Check BIN_DIR:
if [ -z "${BIN_DIR}" ]; then
  echo "`date +%Y.%m.%d" "%H:%M:%S` - ${pkg_name}: ERROR!!! Execution Aborted. Environment variable BIN_DIR not defined" >&2
  exit 2
elif [ ! -d "${BIN_DIR}" ]; then
  echo "`date +%Y.%m.%d" "%H:%M:%S` - ${pkg_name}: ERROR!!! Execution Aborted. Directory BIN_DIR not found (${BIN_DIR})" >&2
  exit 2
fi


# Check COMPANY_NAME:
if [ -z "${COMPANY_NAME}" ]; then
  echo "`date +%Y.%m.%d" "%H:%M:%S` - ${pkg_name}: ERROR!!! Execution Aborted. Environment variable COMPANY_NAME not defined" >&2
  exit 2
fi


# Check HOST_NAME:
if [ -z "${HOST_NAME}" ]; then
  echo "`date +%Y.%m.%d" "%H:%M:%S` - ${pkg_name}: ERROR!!! Execution Aborted. Environment variable HOST_NAME not defined" >&2
  exit 2
fi


# Check MAIL_RECIPIENTS:
if [ -z "${MAIL_DBA}" ]; then
  echo "`date +%Y.%m.%d" "%H:%M:%S` - ${pkg_name}: ERROR!!! Execution Aborted. Environment variable MAIL_RECIPIENTS not defined" >&2
  exit 2
fi


# Check UTL_SEND:
if [ -z "${UTL_SEND}" ]; then
  echo "`date +%Y.%m.%d" "%H:%M:%S` - ${pkg_name}: ERROR!!! Execution Aborted. Environment variable UTL_SEND not defined" >&2
  exit 2
elif [ ! -f "${UTL_SEND}" ]; then
  echo "`date +%Y.%m.%d" "%H:%M:%S` - ${pkg_name}: ERROR!!! Execution Aborted. File UTL_SEND not found (${UTL_SEND})" >&2
  exit 2
elif [ ! -x "${UTL_SEND}" ]; then
  echo "`date +%Y.%m.%d" "%H:%M:%S` - ${pkg_name}: ERROR!!! Execution Aborted. File UTL_SEND not executable (${UTL_SEND})" >&2
  exit 2
fi



# Initialize Package:

pkg_flag="`basename $0 .sh`"
run_in_progress=${TMP_DIR}/${pkg_name}_${oracle_sid}.lock
log_file=${TMP_DIR}/${pkg_name}_${oracle_sid}.log
prefix="${COMPANY_NAME}#${HOST_NAME} ${pkg_name}"
mess_theme="${prefix}: Error! Another process running (${run_in_progress})"

###mail_recipients="$MAIL_DBA"
echo $mail_recipients
mail_recipients="angor@vbrr.ru"
echo $mail_recipients



# Check Another process for running:
if [ -f ${run_in_progress} ]; then
  echo "`date +%Y.%m.%d" "%H:%M:%S` - ${pkg_name}: Error! Another process running. Remove a file ${run_in_progress}" >&2
  echo "Remove a file ${run_in_progress}" | ${BIN_DIR}/_lib/utl_send.sh "${mess_theme}" "${mail_recipients}"
  exit 2
fi


# Prevent Parallel Execution:
touch ${run_in_progress}


# Run Implementation:
${BIN_DIR}/pkg/${pkg_name}/body.sh "${pkg_flag}" "${retention_period}" | tee ${log_file}


# Send E-Mail:
# mess_theme="${host_name}(${oracle_sid}): ${mess_header}"
# cat ${log_file} | ${BIN_DIR}/_lib/utl_send.sh "${mess_theme}" "${mail_recipients}"


# Cleanup Stop Flag:
test -r ${run_in_progress} && rm ${run_in_progress}
$




$vi body.sh

#!/bin/bash

#
# Check Parameters:
#

# Package Name:
tmp_string="`dirname $0`"
pkg_name="`basename ${tmp_string}`"

if [ "${pkg_name}" = "." ]; then
  tmp_string="`pwd`"
  pkg_name="`basename ${tmp_string}`"
fi

# Check for internal call:
if [ ! $1 = '_run' ]; then
  echo "`date +%Y.%m.%d" "%H:%M:%S` - ${pkg_name}: Error! (Parameter=1) Call `basename $0` from ./_run.sh" >&2
  exit 2
fi


# Check For :
if [ $2 ]; then
  retention_period=$2
else
  echo "`date +%Y.%m.%d" "%H:%M:%S` - ${pkg_name}: Error! (Parameter=3) Call `basename $0` With 3-d parameter" >&2
  exit 2
fi


#
# Define local variables:
#

# Variables:


host_name=${HOST_NAME}
oracle_sid=${ORACLE_SID}
mail_recipients="$MAIL_DBA"

sys_audit_dir=${ORACLE_HOME}/rdbms/audit/

echo "`date +%T` Check directory for system audit: (${sys_audit_dir})"

if [ -r ${sys_audit_dir} ]; then
  echo "system audit dir done."
  ${FIND_UTL} /u01/app/oradb/product/11.2.0.3/dbhome_1/rdbms/audit/ -type f -name "*_ora\_*\_*.aud" -mtime +${retention_period} -print -exec ls -l {} \;
  ${FIND_UTL} /u01/app/oradb/product/11.2.0.3/dbhome_1/rdbms/audit/ -type f -name "*_ora\_*\_*.aud" -mtime +${retention_period} -print -exec rm {} \;
else
  loc_mess_theme="${host_name}(${oracle_sid})-${pkg_name}: Error! Not Found Directory for Clean system audit"
  loc_mess_body="Not exist directory: ${sys_audit_dir}"
  echo "${loc_mess_body}" | ${BIN_DIR}/_lib/utl_send.sh "${loc_mess_theme}" "${mail_recipients}"
  echo " - Error!"
  exit
fi
$

четверг, 24 января 2013 г.

Триггеры в Oracle


Триггеры DML

CREATE [OR REPLACE] TRIGGER имя_триггера
{BEFORE | AFTER}
{INSERT | DELETE | UPDATE | UPDATE OF список_столбцов} ON имя_таблицы
[FOR EACH ROW]
[WHEN (...)]
[DECLARE ...]
BEGIN

... исполняемые операторы ...

[EXCEPTION ...]
END [имя_триггера];



Триггер это именованный блок PL/SQL.
Он не может быть вызван из процедуры и не принимает никаких параметров при вызове.
Этот блок срабатывает при определенном событии а именно при запуске операций DML:
-INSERT
-UPDATE
-DELETE

Существуют еще и системные триггеры, которые срабатывают на события самой БД.

Триггеры используют:
Для реализации сложных ограничений целостности данных, которые невозможно осуществить
через описательные ограничения, установленные при создании таблиц.
Организации всевозможных видов аудита.
Оповещения других модулей о том, что делать в случае изменения информации содержащейся в БД.
Для реализации так называемых "бизнес-правил"
Для организации каскадных воздействий на таблицы БД.

Бывают триггеры операторные и строковые.
Операторный триггер активизируется один раз до или после оператора DML/
Строковый триггер активизируется один раз для каждой строки, на которую воздействует оператор DML.

Изменил оператор UPDATE две строки в таблице: строковый триггер активизируется два раза,
а операторный один.

Пример операторного триггера:

create or replace trigger bfotst
    before update on tab1
declare
begin
    insert into tab2(col1, col2, col3, col4)
        values(USER, SYSDATE, 'Update', 'Before statement trigger');
end bfotst;
/



create or replace trigger afttst
    after update on tab1
declare
begin
    insert into tab2(col1, col2, col3, col4)
        values(USER, SYSDATE, 'Update', 'After statement trigger');
end afttst;
/


Строковые триггеры:

create or replace trigger bfotstr
    before update on tab1
    for each row
declare
begin
    insert into tab2(col1, col2, col3, col4)
        values(USER, SYSDATE, 'Update', 'Before row trigger');
end bfotstr;
/


create or replace trigger afttstr
    after update on tab1
    for each row
declare
begin
    insert into tab2(col1, col2, col3, col4)
        values(USER, SYSDATE, 'Update', 'After row trigger');
end afttstr;
/


before - триггер активируется до срабатывания оператора DML.
after  - треггер активируется после срабатывания оператора DML.


Строковый триггер срабатывает один раз для каждой строки.
При этом внутри триггера можно обращаться к строке обрабатываемой
в данный момент времени, с помощью двух псевдозаписей:

:old
:new


create or replace trigger dlttstr
    before delete on tab1
    for each row
declare
begin

    a =  :old.col1;
    c =  :new.col2;
    b =  :old.col3;
 .
 .
 .
end dlttstr;
/



                           :OLD                                            :NEW
--------------------------------------------------------------------------------
INSERT :    NULL                                              значение после вставки
UPDATE :  значение перед изменением       значение после изменения
DELETE :  значение перед удалением          NULL



Рассмотрим пример:

Имеется таблица tab1 с первичным ключом:

ID
col1
col2
col3

Пытаемся в нее сделать вставку так:

insert into tab1(col1, col2, col3) values(var1, var2, var3);

получаем ошибку: невозможно вставить NULL  в ID

Делать нужно так:

создаем последовательность:

create sequence seq1
 start with 8000
 increment by 1;
/

создаем триггер:

create or replace trigger insIDtrig
    before insert on tab1
    for each row
declare
begin
    select seq1.nextval into  :new.ID from dual;
end insIDtrig;
/

теперь можно делать наш INSERT.


Еще пример:

Имеются две таблицы:

tab1:

ID
col1
col2

tab2:

ID
col
col2
idt1

Хотим чтобы вставляя строки в главную таблицу, аналогично вставлялись строки
и в подчиненную таблицу.

Для главной таблицы мы уже создали sequence seq1 и триггер insIDtrig,
который добавляет значения в поле ID таблицы tab1.

Создадим для подчиненной таблицы sequence

create sequence seq2
 start with 5
 increment by 1;
/

и создадим триггер:

create or replace trigger aftinsttrig
    after insert on tab1
    for each row
declare
begin
    insert into tab2(tab2.ID, tab2.col1, tab2.col2, tab2.idt1)
    values(seq2.nextval, :new.col1, :new.col2, :new.ID);
end aftinsttrig;
/


Напишем аналогичный триггер на UPDATE:

create or replace trigger aftupdttrig
    after update on tab1
    for each row
declare
begin
    update tab2
    set
         tab2.col1 =  :new.col1,
         tab2.col2 =  :new.col2,
         tab2.idt1 =  :new.ID
    where
         tab2.idt1 =  :old.ID;
end aftupdttrig;
/


И на удаление:
(каскадное удаление)

create or replace trigger bfrdelttrig
    before delete on tab1
    for each row
declare
begin
    delete from tab2
    where tab2.idt1 =  :old.ID;
end bfrdelttrig;
/

Менять псевдозапись :new в строковом триггере AFTER не имеет смысла,
так как событие уже обработано.

Менять псевдозапись :new возможно в строковом триггере before.
А псевдозапись :old никогда не модифицируется, а только считывается.


Предложение WHEN

Используйте предложение WHEN для уточнения условий выполнения кода триггера.

В этом примере код триггера будет исполняться только при изменении col1 в таблице tab1:

create or replace trigger check_col1_trg
    after update of col1 on tab1
    for each row
when (:old.col1 != :new.col1) or
     (:old.col1 is null and :new.col1 is not null) or
     (:old.col1 is not null and :new.col1 is null)
begin
   .....    

end check_col1_trg;
/



Ограничить время исполнения триггера insert периодом с 9 утра до 5 часов вечера можно так:

create or replace trigger check_time_trg
    before insert on tab1
    for each row
when ( to_char(SYSDATE, 'HH24') between 9 and 17 )

begin
   .....    

end check_time_trg;
/


Триггеры DDL

CREATE [OR REPLACE] TRIGGER имя_триггера
{BEFORE | AFTER} {DDL-событие}
ON {SCHEMA | DATABASE}
[WHEN (...)]
DECLARE
 -- variable declarations
BEGIN
  -- trigger code
EXCEPTION
  -- exception handler
END имя_триггера;
/


DDL - события:

BEFORE / AFTER ALTER
BEFORE / AFTER ANALYZE
BEFORE / AFTER ASSOCIATE STATISTICS
BEFORE / AFTER AUDIT
BEFORE / AFTER COMMENT
BEFORE / AFTER CREATE
BEFORE / AFTER DDL
BEFORE / AFTER DISASSOCIATE STATISTICS
BEFORE / AFTER DROP
BEFORE / AFTER GRANT
BEFORE / AFTER NOAUDIT
BEFORE / AFTER RENAME
BEFORE / AFTER REVOKE
BEFORE / AFTER TRUNCATE
AFTER SUSPEND


Пример:

CREATE TABLE tab1(
col1 VARCHAR2(20)NOT NULL,
col2 VARCHAR2(20)NOT NULL,
col3 DATE NOT NULL,
col4 VARCHAR2(20)NOT NULL,
col5 DATE,
col6 VARCHAR2(20)
);


CREATE OR REPLACE TRIGGER after_ddl_creation
AFTER CREATE ON SCHEMA
BEGIN
  INSERT INTO tab1 VALUES
  (SYS.DICTIONARY_OBJ_NAME,SYS.DICTIONARY_OBJ_TYPE,SYSDATE,USER,NULL,NULL);
END;
/


Триггеры событий базы данных

CREATE [OR REPLACE] TRIGGER имя_триггера
{BEFORE | AFTER} {событие базы данных}
ON {SCHEMA | DATABASE}
DECLARE
 -- variable declarations
BEGIN
  -- trigger code
EXCEPTION
  -- exception handler
END имя_триггера;
/

События базы данных:

AFTER STARTUP
BEFORE SHUTDOWN

AFTER LOGON
BEFORE LOGOFF

AFTER DB_ROLE_CHANGE -- for Data Guard failover and switchover
AFTER SUSPEND
AFTER SERVERERROR (does not trap ...

    ORA-01403: no data found (this is in the Oracle docs but does not seem to be correct)
    ORA-01422: exact fetch returns more than requested number of rows
    ORA-01034: ORACLE not available
    ORA-04030: out of process memory when trying to allocate string bytes (string, string)


Пример:

CREATE TABLE tab1 (
col1 DATE,
col2 VARCHAR2(20));

CREATE OR REPLACE PROCEDURE proc1 IS
BEGIN
  INSERT INTO tab1
  (col1, col2)
  VALUES
  (SYSDATE, USER);
END proc1;
/

CREATE OR REPLACE TRIGGER logintrig
AFTER LOGON ON DATABASE
CALL proc1
/


Получить информацию о триггере:

select * from user_triggers;

Активировать триггер:

alter trigger имя_триггера enable;

Активировать все триггеры для конкретной таблицы:

alter table имя_таблицы enable all triggers;

Заблокировать триггер:

alter trigger имя_триггера disable;

Удалить триггер:

drop trigger имя_триггера;

воскресенье, 20 января 2013 г.

Основы ООП в Python



Классы в Python это полноценные объекты,  даже если нет ни одного экземпляра.
Самый простой класс создается так:

>>> class database :
    pass

>>>

Это пустой класс с именем database без атрибутов и без методов.

Создадим класс с одним атрибутом:

>>> class database :
    name = 'oracle'
   
>>>

Теперь мы можем обращаться к этому атрибуту класса за пределами самого класса:

>>> print(database.name)
oracle
>>>

и даже изменять его значение:

>>> database.name = "ora11gR2"
>>> print(database.name)
ora11gR2
>>>

Тоже самое можно сделать и так:

- сначала создаем пустой класс

>>> class database :
    pass

>>>

После создания класса мы можем присоединить к нему атрибуты,
выполняя операции присваивания за пределами класса:

>>> database.name = "oracle"
>>> database.version = "11.2.0.2"
>>>
>>> print(database.name)
oracle
>>> print(database.version)
11.2.0.2
>>>
>>> database.version = "11.2.0.3"
>>> print(database.version)
11.2.0.3
>>>

Пока у нас имеется ссылка на класс, мы можем в любое время
добавлять или изменять его атрибуты по своему усмотрению.

Пусть у нас имеется простой класс с одним атрибутом:

>>> class test:
    name = 'Larry'

   
>>>

Создадим два экземпляра этого класса:

>>> x = test()
>>> y = test()
>>>

так как они помнят класс из которого были созданы,
они по наследству получат атрибуты класса:

>>> x.name, y.name
('Larry', 'Larry')
>>>

Если выполнить присваивание атрибуту экземпляра,
то будет создан (или изменен) атрибут этого конкретного объекта, а не другого.

Атрибуты обнаруживаются в результате поиска по дереву наследования,
но операция присваивания значения атрибуту воздействует только на тот объект,
к которому эта операция применяется.

>>>
>>> x.name = "Tom"
>>>
>>> test.name, x.name, y.name
('Larry', 'Tom', 'Larry')
>>>

Экземпляр x получил свой собственный атрибут name,
а экземпляр y по прежнему наследует атрибут name, присоединенный к классу test.

Добавим в наш простой класс метод setname с помощью которого мы получим возможность
изменять значение атрибута.


>>> class test:
    name = 'Larry'
    def setname(self, value):
        self.name = value

>>>

Создадим экземпляр класса test.

>>> x = test()
>>>

Он также по наследству получит атрибут name.

>>> x.name
'Larry'
>>>

Но теперь мы можем вызвать метод класса setname который изменяет значение атрибута name.
В качестве параметра укажем, атрибут какого экземпляра мы хотим изменить а также новое значение атрибута name.

>>> test.setname(x, "Tom")
>>>

Мы вызвали данный метод, как метод класса test.

test.setname(...)

Но так как наш экземпляр x, также по наследству от класса test получит и метод setname:

def setname(self, value):
    self.name = value

но уже в таком виде:

def setname(x, value):
    x.name = value

тут уже первый параметр - это имя созданного экземпляра.

То теперь проще вызвать данный метод не из класса test, а из созданного экземпляра x:

>>> x.setname("Tom")
>>>

Имя self внутри метода автоматически ссылается на обрабатываемый экземпляр x,
поэтому операция присваивания сохраняет значение в пространстве имен экземпляра а не класса.


В классе test атрибуты можно и не объявлять, а оставить только метод setname.

>>> class test:
    def setname(self, value):
            self.name = value

>>>

Тогда, после создания экземпляра

>>> x = test()
>>>

Никаких атрибутов он от класса не унаследует.
Унаследуется только метод setname.

И только после первого вызова метода setname

>>> x.setname("Larry")
>>>

У нас появится новый атрибут экземпляра с именем name

>>> x.name
'Larry'
>>>

Методы, которые обычно создаются инструкциями def, вложенными в инструкцию class,
могут создаваться совершенно независимо от объекта класса.

Пусть у нас имеется класс:

>>> class test:
    name = 'Larry'
    def setname(self, value):
        self.name = value

>>>

Мы хотим добавить в этот класс еще один метод getname,
который выводит текущее значение атрибута name.

Определим некую функцию вне класа:

def xyz(self):
    print(self.name)

Это обычная функция, она ничего незнает о классе test.
Она может вызываться как обычная функция.

Есть только единственное ограничение:
Объект, который она получает в качестве параметра, должен иметь атрибут name.

(Имя аргумента "self" не имеет никакого особого смысла и может называться как угодно)

Вызовем эту функцию, передав ей в качестве параметра наш ранее созданный объект x.

>>> xyz(x)
Larry
>>>

Однако, если эту функцию присвоить атрибуту нашего класса, она станет методом, вызываемым из любого экземпляра.
(А также через имя самого класса при условии, что функции вручную будет передан экземпляр)

>>> test.getname = xyz

>>> x.getname()
Larry

Вызвать через имя класса можно так:

>>> test.getname(x)
Larry
>>>

В итоге у нас получился такой класс:

class test:

    name = 'Larry'

    def setname(self, value):
        self.name = value

    def getname(self):
        print(self.name)


Определим новый класс testnew, который наследует все имена из класса test и добавляет свои собственные.


>>> class testnew(test):
    def dispname(self):
        print('Current value = "%s"' % self.name)

        # и такой же метод как и в test
    def getname(self):
        print('Value = "%s"' % self.name)
       
>>>


>>> x = test()

>>> z = testnew()

>>> z.setname("Tom")

>>> z.getname()     # вызовется метод из класса testnew
Value = "Tom"

>>> x.getname()    # вызовется метод из класса test
Larry
>>>

Допустим что класс test находится в модуле modtest.py

Мы хотим создать класс testnew который бы унаследовал все имена класса test.

Тогда нужно импортировать этот модуль

from modtest import test
class testnew(test):
...

Или эквивалентный вариант, импортируем весь модуль целиком:

import modtest
class testnew(modtest.test):
...
тут в скобках мы указываем полное имя.


Пусть имеется файл modtest.py и в нем определен класс:

class test:


Чтобы получить доступ к этому классу, нам необходимо обратиться к модулю, как обычно:

import modtest

x = modtest.test()

обращаемся к модулю и классу внутри модуля.

Можно также использовать инструкцию from

from modtest import test

x = test()

тут обращаемся только к классу.

Согласно общепринятым соглашениям, имена классов в языке Python должны начинаться с заглавной буквы,
а имена модулей с прописных.

import  modtest
x = modtest.Test()


Пусть имеется класс:

class MyClass:
    def display(self):
    print('Current value = "%s"' % self.data)

Создадим такой класс:

>>> class MyNewClass(MyClass):
    def __init__(self, value):
        self.data = value
    def __add__(self, other):
        return MyNewClass(self.data + other)
    def __str__(self):
        return 'MyNewClass: ' + self.data
    def mul(self, other):
        self.data *= other

       
>>> a = MyNewClass("abc")

>>> a.display()
Current value = "abc"

>>> print(a)
MyNewClass: abc

>>> b = a + 'xyz'

>>> b.display()
Current value = "abcxyz"

>>> print(b)
MyNewClass: abcxyz

>>> a.mul(3)

>>> print(a)
MyNewClass: abcabcabc

Обратите внимание, что метод __add__ создает и возвращает новый объект экземпляра
этого класса (вызывая MyNewClass, которому передается значение результата)

А метод mul изменяет текущий объект экземпляра выполняя присваивание атрибуту аргумента self.

Обычно встроенные типы, такие как числа и строки, всегда создают новые объекты при выполнении оператора *.


Атрибуты пространства имен.

>>> class test:
    pass

>>>
>>> test.name = "Tom"
>>> test.age = 40
>>>
>>> x = test()
>>> y = test()
>>>
>>> print(x.name)    # Унаследованные атрибуты
Tom
>>> print(y.name)    # Унаследованные атрибуты
Tom
>>>
>>> x.name = "Larry"
>>> print(x.name)     # Экземпляр x получил собственный атрибут
Larry
>>>

Атрибуты пространства имен обычно реализованы в виде словарей.
И деревья наследования классов тоже всего лишь словари со ссылками на другие словари.

Например в большинстве объектов, созданных на базе классов имеется атрибут :

__dict__

Который является словарем пространства имен.

>>> test.__dict__.keys()
dict_keys(['__module__', 'name', 'age', '__dict__', '__weakref__', '__doc__'])
>>>

>>> list(x.__dict__.keys())
['name']
>>>

>>> list(y.__dict__.keys())
[]
>>>

Как видим в словаре класса присутствуют атрибуты name и age, которые созданы ранее.

Объект x имеет свой собственный атрибут name, а объект y по прежнему пуст.

Каждый экземпляр имеет ссылку на свой наследуемый класс, она называется :

__class__

>>> x.__class__

>>>

Классы также имеют атрибут __bases__, который представляет собой картеж его суперклассов:

>>> test.__bases__
(,)
>>>

Эти два атрибута описывают, как деревья классов размещаются в памяти.

Классы и экземпляры - это всего лишь объекты пространства имен
с атрибутами создаваемыми на лету с помощью операции присваивания.

Обычно эти операции присваивания выполняются внутри инструкции class,
но они могут находиться в любом другом месте, где имеется ссылка на один из объектов в дереве.



#Модуль: test1.py

gl1 = 999              # Глобальная переменная модуля

def fn1():             # Имя функции глобально в пределах модуля
    lf1 = 111          # Локальная переменная в функции
    print("-fn1-")
    print("Видна только в функции", lf1)


class Cl1:

    ac1 = 888          # Атрибут класса

    def mt1(self):     # Метод экземпляра
        lm1 = 777      # Локальная переменная в методе
        self.ae1 = 555 # Атрибут экземпляра
        print("-mt1-")
        print("Видна только в методе", lm1)
        print("Видна только в экземпляре", self.ae1)


    def mt2():     # Статический метод
        lm2 = 333      # Локальная переменная в методе
        print("-mt2-")
        print("Видна только в методе", lm2)
    mt2 = staticmethod(mt2)


    def mt3(cls):     # Метод класса
        lm3 = 444      # Локальная переменная в методе
        print("-mt2-")
        print("Видна только в методе", lm3)
    mt3 = classmethod(mt3)


# Глобальная переменная модуля
print(gl1)

# Функция модуля
fn1()

# Атрибут класса
print(Cl1.ac1)

# Обращение к методам экземпляра

em1 = Cl1()      # Создаем ссылку экземпляр класса

Cl1.mt1(em1)     # Обязательно передаем имя экземпляра первым параметром
em1.mt1()        # Или так

Cl1().mt1()      # Ссылку на экземпляр можно и не создавать

# Обращение к статическим методам

Cl1.mt2()        # имя экземпляра первым параметром не передается
em1.mt2()        # имя экземпляра первым параметром не передается


# Обращение к методам класса

Cl1.mt3()        # автоматически передается имя класса первым параметром
em1.mt3()        # автоматически передается имя класса первым параметром




#Модуль: test2.py

Подсчет количества экземпляров класса:


class Cl1:

    ac1 = 0          # Атрибут класса

    def __init__(self):

        self.ae1 = 555 # Атрибут экземпляра
        print("-init-")
        Cl1.ac1 +=1

    def __del__(self):
        print("-del-")
        Cl1.ac1 -=1


    def mt1(self):     # Метод экземпляра
        print(Cl1.ac1)


ex1 = Cl1()
ex1.mt1()

ex2 = Cl1()
ex3 = Cl1()

ex1.mt1()

del ex2
del ex3

ex1.mt1()