Skip to content

Commit ec0a7a4

Browse files
committed
Add Oracle triggers...
1 parent 982be95 commit ec0a7a4

File tree

6 files changed

+342
-7
lines changed

6 files changed

+342
-7
lines changed

T4SQLTemplateLibrary/Databases/Oracle/T4SQLDB/Scripts/1-Tables/04-TEMPLATE_CLASS.sql

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
IS_ACTIVE CHAR(1) NOT NULL,
99
CLASS_DESCRIPTION NVARCHAR2(1024),
1010

11-
CONSTRAINT PK_TEMPLATE_CLASS PRIMARY KEY (FULL_NAME)
11+
CONSTRAINT PK_TEMPLATE_CLASS PRIMARY KEY (FULL_NAME),
12+
CONSTRAINT CK_IS_ACTIVE CHECK (IS_ACTIVE IN ('Y', 'N'))
1213
)
1314
ORGANIZATION INDEX
1415
STORAGE (INITIAL 128K NEXT 128K);

T4SQLTemplateLibrary/Databases/Oracle/T4SQLDB/Scripts/4-Packages/02-ENGINE.pck

Lines changed: 252 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ CREATE OR REPLACE PACKAGE T4SQL.ENGINE IS
99
-- You must not remove this notice, or any other, from this software.
1010
--
1111
-- Original Author: Abel Cheng <[email protected]>
12-
-- Created Date: October ?15, ?2013, ??11:30:05 PM
12+
-- Created Date: October 15, 2013, 11:30:05 PM
1313
-- Primary Host: http://t4sql.codeplex.com
1414
-- Change Log:
1515
-- Author Date Comment
@@ -22,10 +22,61 @@ CREATE OR REPLACE PACKAGE T4SQL.ENGINE IS
2222
----------------------------------------------------------------------------------------------------
2323

2424

25-
FUNCTION GET_POLL_INTERVAL
26-
RETURN NUMBER;
25+
PROCEDURE GET_CONFIG
26+
(
27+
outPoll_Interval OUT NUMBER
28+
);
29+
30+
31+
PROCEDURE STANDBY_PING
32+
(
33+
outSwitch_To_Mode OUT VARCHAR2
34+
);
35+
36+
PROCEDURE PRIMARY_PING
37+
(
38+
outSwitch_To_Mode OUT VARCHAR2
39+
);
40+
41+
42+
PROCEDURE GET_DB_SERVER_ENV
43+
(
44+
outDatabase_Platform OUT VARCHAR2,
45+
outDatabase_Product OUT VARCHAR2,
46+
outProduct_Version OUT VARCHAR2,
47+
outServer_Name OUT VARCHAR2
48+
);
49+
50+
51+
PROCEDURE REGISTER_TEMPLATE
52+
(
53+
inFull_Name VARCHAR2,
54+
inModule NVARCHAR2,
55+
inAssembly_String VARCHAR2,
56+
inClass_Description NVARCHAR2
57+
);
58+
59+
60+
PROCEDURE REGISTER_TEMPLATE_SPEC
61+
(
62+
inClass_Name VARCHAR2,
63+
inProperty_Name NVARCHAR2,
64+
inDefault_Value NVARCHAR2,
65+
inLink_State NVARCHAR2,
66+
inProperty_Description NVARCHAR2,
67+
inProperty_Order NUMBER
68+
);
69+
70+
71+
PROCEDURE LOG_SYS_ERROR
72+
(
73+
inReference NVARCHAR2,
74+
inMessage VARCHAR
75+
);
2776

2877

78+
PROCEDURE SERVICE_RESTART;
79+
2980

3081
END ENGINE;
3182
/
@@ -48,6 +99,204 @@ BEGIN
4899
END GET_POLL_INTERVAL;
49100

50101

102+
PROCEDURE GET_CONFIG
103+
(
104+
outPoll_Interval OUT NUMBER
105+
) AS
106+
BEGIN
107+
outPoll_Interval := GET_POLL_INTERVAL();
108+
END GET_CONFIG;
109+
110+
111+
PROCEDURE SERVICE_PING
112+
(
113+
inIs_Primary CHAR
114+
) AS
115+
BEGIN
116+
MERGE INTO T4SQL.ENGINE_SERVER P
117+
USING
118+
(
119+
SELECT
120+
NVL(SYS_CONTEXT('USERENV', 'TERMINAL'), '?') AS SERVER_NAME,
121+
SYSTIMESTAMP AS SERVICE_BEAT,
122+
inIs_Primary AS IS_PRIMARY,
123+
NVL(SYS_CONTEXT('USERENV', 'OS_USER'), '?') AS SERVICE_ACCOUNT
124+
FROM
125+
DUAL
126+
) C
127+
ON (P.SERVER_NAME = C.SERVER_NAME)
128+
WHEN MATCHED THEN
129+
UPDATE SET
130+
P.SERVICE_BEAT = C.SERVICE_BEAT,
131+
P.IS_PRIMARY = C.IS_PRIMARY,
132+
P.SERVICE_ACCOUNT = C.SERVICE_ACCOUNT
133+
WHEN NOT MATCHED THEN
134+
INSERT (P.SERVER_NAME, P.SERVICE_BEAT, P.IS_PRIMARY, P.SERVICE_ACCOUNT)
135+
VALUES (C.SERVER_NAME, C.SERVICE_BEAT, C.IS_PRIMARY, C.SERVICE_ACCOUNT);
136+
END SERVICE_PING;
137+
138+
139+
PROCEDURE STANDBY_PING
140+
(
141+
outSwitch_To_Mode OUT VARCHAR2
142+
) AS
143+
tInterval NUMBER := GET_POLL_INTERVAL();
144+
tNow DATE := SYSDATE;
145+
tPrimary_Beat DATE;
146+
BEGIN
147+
UPDATE T4SQL.ENGINE_CONFIG
148+
SET DATE_VALUE = tNow
149+
WHERE DATE_VALUE <= tNow - tInterval
150+
AND ELEMENT_NAME = 'STANDBY_BEAT';
151+
152+
IF SQL%ROWCOUNT > 0 THEN
153+
SELECT DATE_VALUE INTO tPrimary_Beat FROM T4SQL.ENGINE_CONFIG WHERE ELEMENT_NAME = 'PRIMARY_BEAT';
154+
IF (tNow - tPrimary_Beat) > (tInterval / 2) THEN
155+
outSwitch_To_Mode := 'Primary';
156+
ELSE
157+
outSwitch_To_Mode := 'Standby';
158+
END IF;
159+
END IF;
160+
161+
SERVICE_PING('N');
162+
COMMIT;
163+
END STANDBY_PING;
164+
165+
166+
PROCEDURE PRIMARY_PING
167+
(
168+
outSwitch_To_Mode OUT VARCHAR2
169+
) AS
170+
tNow DATE := SYSDATE;
171+
BEGIN
172+
UPDATE T4SQL.ENGINE_CONFIG
173+
SET DATE_VALUE = tNow
174+
WHERE ELEMENT_NAME = 'PRIMARY_BEAT';
175+
176+
outSwitch_To_Mode := 'Primary';
177+
178+
SERVICE_PING('Y');
179+
COMMIT;
180+
END PRIMARY_PING;
181+
182+
183+
PROCEDURE GET_DB_SERVER_ENV
184+
(
185+
outDatabase_Platform OUT VARCHAR2,
186+
outDatabase_Product OUT VARCHAR2,
187+
outProduct_Version OUT VARCHAR2,
188+
outServer_Name OUT VARCHAR2
189+
) AS
190+
BEGIN
191+
outDatabase_Platform := 'Oracle';
192+
outServer_Name := SYS_CONTEXT('USERENV', 'DB_NAME');
193+
194+
SELECT
195+
banner,
196+
REGEXP_SUBSTR(banner, '\d+\.\d+(\.\d+)?(\.\d+)?')
197+
INTO
198+
outDatabase_Product,
199+
outProduct_Version
200+
FROM
201+
v$version
202+
WHERE
203+
banner LIKE 'Oracle Database%';
204+
END GET_DB_SERVER_ENV;
205+
206+
207+
PROCEDURE REGISTER_TEMPLATE
208+
(
209+
inFull_Name VARCHAR2,
210+
inModule NVARCHAR2,
211+
inAssembly_String VARCHAR2,
212+
inClass_Description NVARCHAR2
213+
) AS
214+
BEGIN
215+
MERGE INTO T4SQL.TEMPLATE_CLASS T
216+
USING
217+
(
218+
SELECT
219+
inFull_Name AS FULL_NAME,
220+
inModule AS MODULE,
221+
inAssembly_String AS ASSEMBLY_STRING,
222+
inClass_Description AS CLASS_DESCRIPTION,
223+
SYSDATE AS REGISTER_TIME
224+
FROM
225+
DUAL
226+
) R
227+
ON (T.FULL_NAME = R.FULL_NAME)
228+
WHEN MATCHED THEN
229+
UPDATE SET
230+
T.MODULE = R.MODULE,
231+
T.ASSEMBLY_STRING = R.ASSEMBLY_STRING,
232+
T.START_TIME = R.REGISTER_TIME,
233+
T.IS_ACTIVE = 'Y',
234+
T.CLASS_DESCRIPTION = R.CLASS_DESCRIPTION
235+
WHEN NOT MATCHED THEN
236+
INSERT (FULL_NAME, MODULE, ASSEMBLY_STRING, CREATED_TIME, START_TIME, IS_ACTIVE, CLASS_DESCRIPTION)
237+
VALUES (R.FULL_NAME, R.MODULE, R.ASSEMBLY_STRING, R.REGISTER_TIME, R.REGISTER_TIME, 'Y', R.CLASS_DESCRIPTION);
238+
COMMIT;
239+
END REGISTER_TEMPLATE;
240+
241+
242+
PROCEDURE REGISTER_TEMPLATE_SPEC
243+
(
244+
inClass_Name VARCHAR2,
245+
inProperty_Name NVARCHAR2,
246+
inDefault_Value NVARCHAR2,
247+
inLink_State NVARCHAR2,
248+
inProperty_Description NVARCHAR2,
249+
inProperty_Order NUMBER
250+
) AS
251+
BEGIN
252+
MERGE INTO T4SQL.TEMPLATE_SPEC T
253+
USING
254+
(
255+
SELECT
256+
inClass_Name AS CLASS_NAME,
257+
inProperty_Name AS PROPERTY_NAME,
258+
inDefault_Value AS DEFAULT_VALUE,
259+
inLink_State AS LINK_STATE,
260+
inProperty_Description AS PROPERTY_DESCRIPTION,
261+
inProperty_Order AS PROPERTY_ORDER
262+
FROM
263+
DUAL
264+
) R
265+
ON (T.PROPERTY_NAME = R.PROPERTY_NAME AND T.CLASS_NAME = R.CLASS_NAME)
266+
WHEN MATCHED THEN
267+
UPDATE SET
268+
T.DEFAULT_VALUE = R.DEFAULT_VALUE,
269+
T.LINK_STATE = R.LINK_STATE,
270+
T.PROPERTY_DESCRIPTION = R.PROPERTY_DESCRIPTION,
271+
T.PROPERTY_ORDER = R.PROPERTY_ORDER
272+
WHEN NOT MATCHED THEN
273+
INSERT (CLASS_NAME, PROPERTY_NAME, DEFAULT_VALUE, LINK_STATE, PROPERTY_DESCRIPTION, PROPERTY_ORDER)
274+
VALUES (R.CLASS_NAME, R.PROPERTY_NAME, R.DEFAULT_VALUE, R.LINK_STATE, R.PROPERTY_DESCRIPTION, R.PROPERTY_ORDER);
275+
COMMIT;
276+
END REGISTER_TEMPLATE_SPEC;
277+
278+
279+
PROCEDURE LOG_SYS_ERROR
280+
(
281+
inReference NVARCHAR2,
282+
inMessage VARCHAR
283+
) AS
284+
BEGIN
285+
INSERT INTO T4SQL.EVENT_LOG (LOG_TIME, LOG_TYPE, REFERENCE_, MESSAGE_)
286+
VALUES (SYSTIMESTAMP, 'Error', inReference, inMessage);
287+
COMMIT;
288+
END LOG_SYS_ERROR;
289+
290+
291+
PROCEDURE SERVICE_RESTART
292+
AS
293+
BEGIN
294+
UPDATE T4SQL.TEMPLATE_CLASS
295+
SET IS_ACTIVE = 'N'
296+
WHERE IS_ACTIVE = 'Y';
297+
COMMIT;
298+
END SERVICE_RESTART;
299+
51300

52301
END ENGINE;
53302
/
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CREATE OR REPLACE TRIGGER TRG_WORKSPACE_ENTRY_DEL
2+
BEFORE DELETE ON T4SQL.WORKSPACE_ENTRY
3+
FOR EACH ROW
4+
BEGIN
5+
IF :old.WORKITEM_TABLE_NAME = 'T4SQL.SEED_WORKITEM' AND :old.PROPERTY_TABLE_NAME = 'T4SQL.SEED_PROPERTY' THEN
6+
RAISE_APPLICATION_ERROR(-21001, 'Built-in workspace T4SQL.SEED_... cannot be deleted!');
7+
END IF;
8+
END;
9+
/
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
CREATE OR REPLACE TRIGGER TRG_WORKSPACE_ENTRY_INS
2+
BEFORE INSERT OR UPDATE ON T4SQL.WORKSPACE_ENTRY
3+
FOR EACH ROW
4+
DECLARE
5+
tWorkitem_Schema VARCHAR2(30) := T4SQL.META.PARSENAME(:new.WORKITEM_TABLE_NAME, 2);
6+
tWorkitem_Table VARCHAR2(30) := T4SQL.META.PARSENAME(:new.WORKITEM_TABLE_NAME, 1);
7+
tProperty_Schema VARCHAR2(30) := T4SQL.META.PARSENAME(:new.PROPERTY_TABLE_NAME, 2);
8+
tProperty_Table VARCHAR2(30) := T4SQL.META.PARSENAME(:new.PROPERTY_TABLE_NAME, 1);
9+
BEGIN
10+
IF tWorkitem_Schema IS NULL OR tProperty_Schema IS NULL THEN
11+
RAISE_APPLICATION_ERROR(-21741, 'Schema must be specified in qualified table name');
12+
END IF;
13+
14+
IF LENGTH(tWorkitem_Table) > 22 THEN
15+
RAISE_APPLICATION_ERROR(-20972, 'Table name in WORKITEM_TABLE_NAME is too long (maximum length 22 bytes)');
16+
END IF;
17+
18+
IF LENGTH(tProperty_Table) > 22 THEN
19+
RAISE_APPLICATION_ERROR(-20972, 'Table name in PROPERTY_TABLE_NAME is too long (maximum length 22 bytes)');
20+
END IF;
21+
22+
IF NOT T4SQL.META.EXISTS_TABLE(tWorkitem_Schema, tWorkitem_Table) THEN
23+
RAISE_APPLICATION_ERROR(-20942, 'WORKITEM_TABLE_NAME table does not exist in the database');
24+
END IF;
25+
26+
IF NOT T4SQL.META.EXISTS_TABLE(tProperty_Schema, tProperty_Table) THEN
27+
RAISE_APPLICATION_ERROR(-20942, 'PROPERTY_TABLE_NAME table does not exist in the database');
28+
END IF;
29+
30+
IF UPDATING AND :old.WORKITEM_TABLE_NAME = 'T4SQL.SEED_WORKITEM' AND :old.PROPERTY_TABLE_NAME = 'T4SQL.SEED_PROPERTY'
31+
AND (:new.WORKITEM_TABLE_NAME <> 'T4SQL.SEED_WORKITEM' OR :new.PROPERTY_TABLE_NAME <> 'T4SQL.SEED_PROPERTY') THEN
32+
RAISE_APPLICATION_ERROR(-21001, 'Built-in workspace T4SQL.SEED_... cannot be removed!');
33+
END IF;
34+
35+
:new.WORKITEM_TABLE_NAME := tWorkitem_Schema || '.' || tWorkitem_Table;
36+
:new.PROPERTY_TABLE_NAME := tProperty_Schema || '.' || tProperty_Table;
37+
38+
-- Compare new workspace with SEED workspace to check compatibility of table definitions.
39+
IF NOT T4SQL.META.MATCH_TABLE_DEFINITION('T4SQL', 'SEED_WORKITEM', tWorkitem_Schema, tWorkitem_Table) OR
40+
NOT T4SQL.META.MATCH_TABLE_DEFINITION('T4SQL', 'SEED_PROPERTY', tProperty_Schema, tProperty_Table) THEN
41+
RAISE_APPLICATION_ERROR(-21002, 'Tables definition of add-in workspace is not compatible with built-in workspace T4SQL.SEED_...!');
42+
END IF;
43+
44+
-- Create trigger for each new workspace to auto-copy properties' default values while inserting a new workitem.
45+
T4SQL.META.CREATE_WORKITEM_TRIGGER(:new.WORKITEM_TABLE_NAME);
46+
END;
47+
/

T4SQLTemplateLibrary/Databases/Oracle/T4SQLDB/T4SQLDB.modelproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,12 @@
6969
<Content Include="Scripts\5-Triggers\01-TRG_SEED_WORKITEM_IU.sql">
7070
<SubType>Content</SubType>
7171
</Content>
72+
<Content Include="Scripts\5-Triggers\02-TRG_WORKSPACE_ENTRY_DEL.trg">
73+
<SubType>Content</SubType>
74+
</Content>
75+
<Content Include="Scripts\5-Triggers\03-TRG_WORKSPACE_ENTRY_INS.trg">
76+
<SubType>Content</SubType>
77+
</Content>
7278
<Content Include="Scripts\Privileges.sql">
7379
<SubType>Content</SubType>
7480
</Content>

T4SQLTemplateLibrary/Databases/SqlServer/Schema Objects/Schemas/T4SQL/Tables/Triggers/T4SQL.WORKSPACE_ENTRY.TRG_WORKSPACE_ENTRY_INS.trigger.sql

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,33 @@
11
CREATE TRIGGER T4SQL.TRG_WORKSPACE_ENTRY_INS
22
ON T4SQL.WORKSPACE_ENTRY
3-
AFTER INSERT, UPDATE
4-
AS
3+
AFTER INSERT, UPDATE
4+
AS
55
BEGIN
66
SET NOCOUNT ON;
7-
DECLARE @tCount INT, @tValidated INT, @tMatched INT;
7+
DECLARE @tCount INT, @tValidated INT, @tMatched INT, @tSeed_Workitem INT, @tSeed_Property INT;
8+
9+
SET @tSeed_Workitem = OBJECT_ID(N'T4SQL.SEED_WORKITEM');
10+
SET @tSeed_Property = OBJECT_ID(N'T4SQL.SEED_PROPERTY');
11+
12+
IF (UPDATE(WORKITEM_TABLE_NAME) OR UPDATE(PROPERTY_TABLE_NAME)) AND EXISTS
13+
(
14+
SELECT 1
15+
FROM
16+
deleted
17+
WHERE OBJECT_ID(WORKITEM_TABLE_NAME) = @tSeed_Workitem
18+
AND OBJECT_ID(PROPERTY_TABLE_NAME) = @tSeed_Property
19+
) AND NOT EXISTS
20+
(
21+
SELECT 1
22+
FROM inserted
23+
WHERE OBJECT_ID(WORKITEM_TABLE_NAME) = @tSeed_Workitem
24+
AND OBJECT_ID(PROPERTY_TABLE_NAME) = @tSeed_Property
25+
)
26+
BEGIN
27+
RAISERROR(N'Built-in workspace T4SQL.SEED_... cannot be removed!', 16, 3);
28+
ROLLBACK TRANSACTION;
29+
RETURN;
30+
END;
831

932
-- Check the existence of every workspace (WORKITEM_TABLE_NAME, PROPERTY_TABLE_NAME).
1033

0 commit comments

Comments
 (0)