Files
Database/ADM/ADM_PAC.SRC
Erik Groener f7e9c3e10b FCLT#54494 Beveiliging klantscripts iets generieker maken
svn path=/Database/trunk/; revision=40593
2019-01-18 08:57:11 +00:00

176 lines
6.3 KiB
Plaintext

/* $Revision$
* $Id$
*/
CREATE OR REPLACE PACKAGE adm
AS
PROCEDURE systrackscriptId (svnid IN VARCHAR2, force IN NUMBER DEFAULT 1);
PROCEDURE trydrop (n IN VARCHAR2);
PROCEDURE tryalter (n IN VARCHAR2);
FUNCTION scriptspoolfile(custpattern IN VARCHAR2, scriptname IN VARCHAR2) RETURN VARCHAR2;
FUNCTION getscriptspoolfile(scriptname IN VARCHAR2) RETURN VARCHAR2;
FUNCTION checkscriptcust(custpattern IN VARCHAR2) RETURN VARCHAR2;
END adm;
/
CREATE OR REPLACE PACKAGE BODY adm
AS
-- Voor SVN is dit handiger, vereist alleen de svn-id string
-- ($Id$)
PROCEDURE systrackscriptId (svnid IN VARCHAR2, force IN NUMBER DEFAULT 1)
AS
revisionnr adm_tracking.adm_tracking_revision%TYPE;
scriptname adm_tracking.adm_tracking_name%TYPE;
tempstr VARCHAR2 (100);
BEGIN
-- op het gemakje ontleden
tempstr := REPLACE (svnid, '$Id: ', '');
tempstr := RTRIM(SUBSTR(tempstr, 1, instr(tempstr, ' ', 1, 2)));
-- is nu: ADM_PAC.SRC 19151
scriptname := RTRIM(SUBSTR(tempstr, 1, instr(tempstr, ' ', 1, 1))); -- ADM_PAC
revisionnr := SUBSTR(tempstr, instr(tempstr, ' ', 1, 1) + 1); -- 19151
IF force = 1
THEN
INSERT INTO adm_tracking (adm_tracking_name, adm_tracking_revision)
VALUES (scriptname, revisionnr);
ELSE
BEGIN
UPDATE adm_tracking
SET adm_tracking_date = SYSDATE, adm_tracking_osuser = SYS_CONTEXT ('USERENV', 'OS_USER')
WHERE UPPER (adm_tracking_name) = UPPER (scriptname)
AND UPPER (adm_tracking_revision) = UPPER (revisionnr);
IF SQL%ROWCOUNT = 0
THEN
INSERT INTO adm_tracking (adm_tracking_name, adm_tracking_revision)
VALUES (scriptname, revisionnr);
END IF;
END;
END IF;
END;
-- DDL. Probeert een object (TABLE, INDEX e.d.) te droppen, maar moppert niet als die niet bestond
-- Hiermee voorkomen we foutmeldingen in logfiles die niet erg zijn
PROCEDURE trydrop (n IN VARCHAR2)
AS
stmt VARCHAR2 (1000);
BEGIN
stmt := 'DROP ' || n;
EXECUTE IMMEDIATE stmt;
DBMS_OUTPUT.put_line ('Found, successfully dropped: ' || n);
EXCEPTION
WHEN OTHERS
THEN
IF SQLCODE IN (-942, -1418, -2289, -4043, -4080)
THEN
-- did not exist, voor table, view, index, sequence, object and trigger
DBMS_OUTPUT.put_line ('Not found, no need to drop: ' || n);
NULL;
ELSE
raise_application_error (-20001, 'Error trying to DROP ' || n || ': ' || SQLERRM);
END IF;
END;
-- DDL. Probeert een object (TABLE, INDEX e.d.) te alteren, maar moppert niet als die niet bestond
-- Hiermee voorkomen we foutmeldingen in logfiles die niet erg zijn
PROCEDURE tryalter (n IN VARCHAR2)
AS
stmt VARCHAR2 (1000);
BEGIN
stmt := 'ALTER ' || n;
EXECUTE IMMEDIATE stmt;
DBMS_OUTPUT.put_line ('Found, successfully altered: ' || n);
EXCEPTION
WHEN OTHERS
THEN
IF SQLCODE IN (-904, -942, -1418, -2289, -4043, -4080, -2443)
THEN
-- did not exist, voor identifier (column) table, view, index, sequence, object and trigger, constraint
DBMS_OUTPUT.put_line ('Not found, not altered: ' || n);
NULL;
ELSIF SQLCODE IN (-955, -1442)
THEN
-- object or not-null property already exist
DBMS_OUTPUT.put_line ('Already exists, not altered: ' || n);
NULL;
ELSE
raise_application_error (-20001, 'Error trying to ALTER ' || n || ': ' || SQLERRM);
END IF;
END;
FUNCTION scriptspoolfile (custpattern IN VARCHAR2, -- eg ^SGGR for 'start with SGGR', ATCH|BONS for two schema
scriptname IN VARCHAR2)
RETURN VARCHAR2
IS
lstname VARCHAR2 (255);
tekst VARCHAR2 (255);
BEGIN
IF NOT REGEXP_LIKE(USER, custpattern, 'i') THEN
tekst := CHR(10) || '============================================' || CHR(10)
|| 'Wrong user!!!!!!!!!' || CHR(10)
|| 'User should be match ' || custpattern || ' but is ' || USER || CHR(10)
|| '============================================' || CHR(10);
RAISE_APPLICATION_ERROR(-20000, tekst);
END IF;
lstname := UPPER (scriptname);
RETURN lstname || '_'
|| UPPER( USER
|| '_'
|| SYS_CONTEXT ('USERENV', 'SERVICE_NAME')
|| '_'
|| SYS_CONTEXT ('USERENV', 'SERVER_HOST'))
|| '_'
|| TO_CHAR (SYSDATE, 'YYYYMMDD_HH24MISS')
|| '.lst';
END;
FUNCTION getscriptspoolfile(scriptname IN VARCHAR2)
RETURN VARCHAR2
IS
lstname VARCHAR2 (255);
BEGIN
lstname := UPPER(scriptname)
|| '_' || UPPER( USER || '_' || SYS_CONTEXT ('USERENV', 'SERVICE_NAME')
|| '_' || SYS_CONTEXT ('USERENV', 'SERVER_HOST')
)
|| '_' || TO_CHAR (SYSDATE, 'YYYYMMDD_HH24MISS')
|| '.lst';
RETURN lstname;
END;
FUNCTION checkscriptcust(custpattern IN VARCHAR2)
RETURN VARCHAR2
IS
klant fac_version.fac_version_cust%TYPE;
groep fac_version.fac_version_group%TYPE;
tekst VARCHAR2 (255);
BEGIN
tekst := '';
SELECT fac_version_cust
, fac_version_group
INTO klant
, groep
FROM fac_version;
IF NOT (custpattern = klant OR custpattern = groep OR REGEXP_LIKE(USER, custpattern, 'i'))
THEN
tekst := CHR(10)
|| '============================================' || CHR(10)
|| 'Wrong user!!!!!!!!!' || CHR(10)
|| 'User should be '|| klant ||' or match ' || custpattern || ' but is ' || USER || CHR(10)
|| '============================================' || CHR(10);
RAISE_APPLICATION_ERROR(-20000, tekst);
END IF;
RETURN tekst;
END;
END adm;
/
REGISTERRUN('$Id$')