oracle 创建存储过程包(触发器同步用户到LDAP)

1. 创建存储过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
CREATE OR REPLACE PACKAGE BODY LDAP_SYNC_EAC IS

MY_SESSION DBMS_LDAP.SESSION; -- session对象,用于事务处理

CONNECT_RETVAL PLS_INTEGER := -1; --用于接收异常代码

CLOSE_CONNECT_RETVAL PLS_INTEGER := -1; --用于接收异常代码

--查询未同步的人,00条一处理

/*CURSOR SELECT_DATA_TABLE(IDNUMBER VARCHAR2) IS

SELECT S.ID_NUMBER,

S.USER_PWD,

S.MOBILE

FROM SYS_UICM_USER S

WHERE S.IS_ACTIVE = '1'

AND S.ID_NUMBER = IDNUMBER

AND ROWNUM <= 500

ORDER BY S.ID_NUMBER ASC;

REC_SELECT_DATA_TABLE SELECT_DATA_TABLE%ROWTYPE;*/

LDAP_BASE_ITT VARCHAR(256) := 'ou=people,dc=bufx,dc=edu,dc=cn'; --用户的根节点

ERR_MSG VARCHAR2(1000) := '';

--连接dap,生成ession

FUNCTION CONNECT_LDAP RETURN PLS_INTEGER IS

LDAP_HOST VARCHAR(256) := '127.0.0.1'; --LDAP服务器P地址

LDAP_PORT VARCHAR(256) := '389'; --LDAP服务器端口

LDAP_USER VARCHAR(256) := 'cn=admin,dc=bufx,dc=edu,dc=cn'; --管理员n;

LDAP_PASSWD VARCHAR(256) := '123456'; --管理员密码

RETVAL PLS_INTEGER := -1; --用于接受异常代码

BEGIN

DBMS_LDAP.USE_EXCEPTION := FALSE; --打开异常

MY_SESSION := DBMS_LDAP.INIT(LDAP_HOST, LDAP_PORT);

--管理员登陆

RETVAL := DBMS_LDAP.SIMPLE_BIND_S(MY_SESSION, LDAP_USER, LDAP_PASSWD);

RETURN RETVAL;

END CONNECT_LDAP;

FUNCTION INSERT_LDAP(IN_USER_ID VARCHAR2,
IN_USER_PWD VARCHAR2,
IN_USER_MOBILE VARCHAR2)

RETURN PLS_INTEGER IS

MOD_USER VARCHAR2(500); --需要操作的用户帐号

MY_ARRAY DBMS_LDAP.MOD_ARRAY;

MY_VALS DBMS_LDAP.STRING_COLLECTION;

RETVAL PLS_INTEGER := -1; --用于接受异常代码

LDAP_BASE_USE VARCHAR2(500);

BEGIN

LDAP_BASE_USE := LDAP_BASE_ITT;

MOD_USER := 'cn=' || IN_USER_ID || ',' ||

LDAP_BASE_USE;

MY_ARRAY := DBMS_LDAP.CREATE_MOD_ARRAY(20);

MY_VALS(1) := IN_USER_ID;

DBMS_LDAP.POPULATE_MOD_ARRAY(MY_ARRAY,

DBMS_LDAP.MOD_ADD,

'cn',

MY_VALS);

MY_VALS(1) := IN_USER_ID;

DBMS_LDAP.POPULATE_MOD_ARRAY(MY_ARRAY,

DBMS_LDAP.MOD_ADD,

'sn',

MY_VALS);

MY_VALS(1) := PwdToLdap(IN_USER_PWD);

DBMS_LDAP.POPULATE_MOD_ARRAY(MY_ARRAY,

DBMS_LDAP.MOD_ADD,

'userPassword',

MY_VALS);

MY_VALS(1) := IN_USER_MOBILE;

DBMS_LDAP.POPULATE_MOD_ARRAY(MY_ARRAY,

DBMS_LDAP.MOD_ADD,

'mobile',

MY_VALS);

MY_VALS(1) := 'inetOrgPerson';

DBMS_LDAP.POPULATE_MOD_ARRAY(MY_ARRAY,

DBMS_LDAP.MOD_ADD,

'objectClass',

MY_VALS);

/* my_vals(1) := 'organizationalPerson';

dbms_ldap.populate_mod_array(my_array,

dbms_ldap.MOD_ADD,

'objectClass',

my_vals);*/

--设置用户的dap对象类这个是在建立epole节点时scc设置的

--my_vals(1) := 'top';

--my_vals(2) := 'person';

--my_vals(3) := 'organizationalPerson';

--my_vals(4) := 'inetOrgPerson';

--my_vals(5) := 'dcpPerson';

/*my_vals(1) := 'inetOrgPerson';

dbms_ldap.populate_mod_array(my_array,

dbms_ldap.MOD_ADD,

'objectclass',

my_vals);*/

--添加操作

RETVAL := DBMS_LDAP.ADD_S(MY_SESSION, MOD_USER, MY_ARRAY);

--retval如果返回8,代表已经存在此用户

--释放数组

DBMS_LDAP.FREE_MOD_ARRAY(MY_ARRAY);

RETURN RETVAL;

END INSERT_LDAP;

FUNCTION DELETE_LDAP(IN_USER_ID VARCHAR2)

RETURN PLS_INTEGER IS

MOD_USER VARCHAR2(500); --需要操作的用户帐号

RETVAL PLS_INTEGER := -1; --用于接受异常代码

LDAP_BASE_USE VARCHAR2(500);

BEGIN

LDAP_BASE_USE := LDAP_BASE_ITT;

MOD_USER := 'cn=' || IN_USER_ID || ',' || LDAP_BASE_USE;

RETVAL := DBMS_LDAP.DELETE_S(MY_SESSION, MOD_USER);

RETURN RETVAL;

END DELETE_LDAP;

FUNCTION UPDATE_LDAP(IN_USER_ID VARCHAR2,
IN_USER_PWD VARCHAR2,
IN_USER_MOBILE VARCHAR2)

RETURN PLS_INTEGER IS

MOD_USER VARCHAR2(500); --需要操作的用户帐号

MY_ARRAY DBMS_LDAP.MOD_ARRAY;

MY_VALS DBMS_LDAP.STRING_COLLECTION;

RETVAL PLS_INTEGER := -1; --用于接受异常代码

LDAP_BASE_USE VARCHAR2(500);

BEGIN

LDAP_BASE_USE := LDAP_BASE_ITT;

MOD_USER := 'cn=' || IN_USER_ID || ',' ||

LDAP_BASE_USE;

MY_ARRAY := DBMS_LDAP.CREATE_MOD_ARRAY(14);

MY_VALS(1) := IN_USER_ID;

DBMS_LDAP.POPULATE_MOD_ARRAY(MY_ARRAY,

DBMS_LDAP.MOD_REPLACE,

'cn',

MY_VALS);

MY_VALS(1) := IN_USER_ID;

DBMS_LDAP.POPULATE_MOD_ARRAY(MY_ARRAY,

DBMS_LDAP.MOD_REPLACE,
'sn',
MY_VALS);

MY_VALS(1) := PwdToLdap(IN_USER_PWD);

DBMS_LDAP.POPULATE_MOD_ARRAY(MY_ARRAY,

DBMS_LDAP.MOD_REPLACE,

'userPassword',

MY_VALS);

MY_VALS(1) := IN_USER_MOBILE;

DBMS_LDAP.POPULATE_MOD_ARRAY(MY_ARRAY,

DBMS_LDAP.MOD_REPLACE,

'mobile',

MY_VALS);

--修改操作

RETVAL := DBMS_LDAP.MODIFY_S(MY_SESSION, MOD_USER, MY_ARRAY);

--释放数组

DBMS_LDAP.FREE_MOD_ARRAY(MY_ARRAY);

RETURN RETVAL;

END UPDATE_LDAP;

---USER_ID 用户登录账号
---USER_ACTIVE 是否有效
---OP_TYPE 操作类型
PROCEDURE SYNC_PERSON(USER_ID VARCHAR2,
USER_PWD VARCHAR2,
USER_MOBILE VARCHAR2,
OP_TYPE VARCHAR2) AS

RETVAL PLS_INTEGER := -1; --用于接受异常代码

BEGIN

--开始连接dap,生成ession,如果连接不成功,则退出程序

CONNECT_RETVAL := CONNECT_LDAP;

--DBMS_OUTPUT.PUT_LINE('开始连接ldap');

IF CONNECT_RETVAL = 0 THEN

IF OP_TYPE = 'INT' THEN

RETVAL := INSERT_LDAP(USER_ID, USER_PWD, USER_MOBILE);

ELSIF OP_TYPE = 'UPT' THEN

RETVAL := UPDATE_LDAP(USER_ID, USER_PWD, USER_MOBILE);

ELSIF OP_TYPE = 'DEL' THEN

RETVAL := DELETE_LDAP(USER_ID);

END IF;

ELSE

DBMS_OUTPUT.PUT_LINE('ldap连接失败);

END IF;

--关闭dap连接的ession

CLOSE_CONNECT_RETVAL := DBMS_LDAP.UNBIND_S(MY_SESSION);

EXCEPTION

WHEN OTHERS THEN

ERR_MSG := 'ERR:' || TO_CHAR(SQLCODE) || ' ' || SQLERRM;

DBMS_OUTPUT.PUT_LINE('系统出错的日志为' || ERR_MSG);

END SYNC_PERSON;

/*PROCEDURE SYNC_PERSON(USER_ID VARCHAR2, OP_TYPE VARCHAR2) AS

--记数器

I NUMBER := 0;

RETVAL PLS_INTEGER := -1; --用于接受异常代码

BEGIN

--开始读数据

IF SELECT_DATA_TABLE%ISOPEN THEN

CLOSE SELECT_DATA_TABLE;

END IF;

OPEN SELECT_DATA_TABLE(USER_ID);

LOOP

FETCH SELECT_DATA_TABLE

INTO REC_SELECT_DATA_TABLE;

IF SELECT_DATA_TABLE%NOTFOUND THEN

CLOSE SELECT_DATA_TABLE;

EXIT;

ELSE

--首次读数据开始连接ldap,生成ession,如果连接不成功,则退出程序

IF I = 0 THEN

CONNECT_RETVAL := CONNECT_LDAP;

DBMS_OUTPUT.PUT_LINE('开始连接ldap');

END IF;

IF CONNECT_RETVAL = 0 THEN

DBMS_OUTPUT.PUT_LINE('开始进行业务操作 || I);

IF OP_TYPE = 'INT' THEN

RETVAL := INSERT_LDAP(REC_SELECT_DATA_TABLE);

ELSIF OP_TYPE = 'UPT' THEN

RETVAL := UPDATE_LDAP(REC_SELECT_DATA_TABLE);

ELSIF OP_TYPE = 'DEL' THEN

RETVAL := DELETE_LDAP(REC_SELECT_DATA_TABLE);

END IF;

ELSE

DBMS_OUTPUT.PUT_LINE('ldap连接失败);

EXIT;

END IF;

\*sync_person_over(rec_select_data_table, retval);*\

I := I + 1;

END IF;

END LOOP;

IF I > 0 THEN

--关闭dap连接的ession

CLOSE_CONNECT_RETVAL := DBMS_LDAP.UNBIND_S(MY_SESSION);

END IF;

EXCEPTION

WHEN OTHERS THEN

ERR_MSG := 'ERR:' || TO_CHAR(SQLCODE) || ' ' || SQLERRM;

DBMS_OUTPUT.PUT_LINE('系统出错的日志为' || ERR_MSG);

END SYNC_PERSON;*/

END LDAP_SYNC_EAC;

2.创建存储过程(初始化用户到 LDAP)

1
2
3
4
5
6
7
8
9
10
CREATE OR REPLACE PACKAGE LDAP_SYNC_EAC IS


PROCEDURE SYNC_PERSON(USER_ID VARCHAR2,
USER_PWD VARCHAR2,
USER_MOBILE VARCHAR2,
OP_TYPE VARCHAR2);


END LDAP_SYNC_EAC;

3.添加触发器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
create or replace trigger tr_sys_uicm_user_eac after insert or update or DELETE
on sys_uicm_user FOR EACH ROW
DECLARE
--这里是关键的地方,在变量申明的地方,指定自定义事务处理。
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
IF INSERTING THEN
--INSERT触发
--启用插入DAP
IF :NEW.IS_ACTIVE = '1' THEN
LDAP_SYNC_EAC.SYNC_PERSON(:NEW.ID_NUMBER,
:NEW.USER_PWD,
:NEW.MOBILE,
'INT');
END IF;

ELSIF UPDATING THEN

--UPDATE触发
IF :NEW.IS_ACTIVE = '1' AND :NEW.IS_DEL = '0' THEN
IF :OLD.IS_ACTIVE = '1' AND :OLD.IS_DEL = '0' THEN
LDAP_SYNC_EAC.SYNC_PERSON(:NEW.ID_NUMBER,
:NEW.USER_PWD,
:NEW.MOBILE,
'UPT');
ELSE
LDAP_SYNC_EAC.SYNC_PERSON(:NEW.ID_NUMBER,
:NEW.USER_PWD,
:NEW.MOBILE,
'INT');
END IF;
ELSE
LDAP_SYNC_EAC.SYNC_PERSON(:NEW.ID_NUMBER, '', '', 'DEL');
END IF;

ELSIF DELETING THEN
--DELETE触发
LDAP_SYNC_EAC.SYNC_PERSON(:OLD.ID_NUMBER,'','', 'DEL');

END IF;
END;

oracle 创建存储过程包(触发器同步用户到LDAP)

https://blog.buubiu.com/oracle-创建存储过程包(触发器同步用户到LDAP)/

作者

buubiu

发布于

2019-11-29

更新于

2024-01-25

许可协议