Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c7b802f

Browse files
committed
Cleanup some grants to internal objects & tables
Removed grants: - execute on ut_annotations - execute on ut_annotation - execute on ut_annotated_object - execute on ut_annotated_objects - select on ut_annotation_cache - select on ut_annotation_cache_info - execute ut_annotation_cache_manager - execute ut_annotation_parser Reorganized code to accommodate for grants removal. Wrapped `sys.dbms_assert.qualified_sql_name` to support NULL values. Replaced calls to `dbms_crypto.hash` with `ut_utils.get_hash` - default `SHA1`
1 parent fdbc3b4 commit c7b802f

27 files changed

Lines changed: 324 additions & 461 deletions

.travis/install.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ end;
9797
PROMPT Granting $UT3_OWNER tables to $UT3_TESTER
9898
9999
begin
100-
for i in ( select table_name from all_tables t where owner = 'UT3' and nested = 'NO' and IOT_TYPE is NULL)
100+
for i in ( select table_name from all_tables t where owner = 'UT3' and nested = 'NO' and IOT_NAME is NULL)
101101
loop
102102
execute immediate 'grant select on UT3.'||i.table_name||' to UT3_TESTER';
103103
end loop;

source/api/ut_runner.pkb

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -285,10 +285,7 @@ create or replace package body ut_runner is
285285
if l_item is not null then
286286
l_result :=
287287
l_result ||
288-
dbms_crypto.hash(
289-
to_char( dbms_utility.get_hash_value( l_item, 1, a_random_seed ) ),
290-
dbms_crypto.hash_sh1
291-
);
288+
ut_utils.get_hash( to_char( dbms_utility.get_hash_value( l_item, 1, a_random_seed ) ) );
292289
end if;
293290
exit when l_at_end;
294291
l_result := l_result || chr(0);

source/core/annotations/ut_annotation_cache_manager.pkb

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,12 +91,29 @@ create or replace package body ut_annotation_cache_manager as
9191
commit;
9292
end;
9393

94+
function get_annotations_objects_info(a_object_owner varchar2, a_object_type varchar2) return ut_annotation_objs_cache_info is
95+
l_result ut_annotation_objs_cache_info;
96+
begin
97+
select ut_annotation_obj_cache_info(
98+
object_owner => i.object_owner,
99+
object_name => i.object_name,
100+
object_type => i.object_type,
101+
needs_refresh => 'N',
102+
parse_time => i.parse_time
103+
)
104+
bulk collect into l_result
105+
from ut_annotation_cache_info i
106+
where i.object_owner = a_object_owner
107+
and i.object_type = a_object_type;
108+
return l_result;
109+
end;
110+
94111
function get_cache_schema_info(a_object_owner varchar2, a_object_type varchar2) return t_cache_schema_info is
95112
l_result t_cache_schema_info;
96113
begin
97114
begin
98115
select *
99-
into l_result
116+
into l_result
100117
from ut_annotation_cache_schema s
101118
where s.object_type = a_object_type and s.object_owner = a_object_owner;
102119
exception

source/core/annotations/ut_annotation_cache_manager.pks

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ create or replace package ut_annotation_cache_manager authid definer as
3434
*/
3535
function get_annotations_for_objects(a_cached_objects ut_annotation_objs_cache_info, a_parse_time timestamp) return sys_refcursor;
3636

37+
38+
function get_annotations_objects_info(a_object_owner varchar2, a_object_type varchar2) return ut_annotation_objs_cache_info;
39+
3740
function get_cache_schema_info(a_object_owner varchar2, a_object_type varchar2) return t_cache_schema_info;
3841

3942
/**

source/core/annotations/ut_annotation_manager.pkb

Lines changed: 44 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ create or replace package body ut_annotation_manager as
1616
limitations under the License.
1717
*/
1818

19+
gc_max_objects_limit integer := 1000000;
1920
------------------------------
2021
--private definitions
2122

@@ -24,29 +25,28 @@ create or replace package body ut_annotation_manager as
2425
l_ut_owner varchar2(250) := ut_utils.ut_owner;
2526
l_objects_view varchar2(200) := ut_metadata.get_objects_view_name();
2627
l_cursor_text varchar2(32767);
28+
l_data ut_annotation_objs_cache_info;
2729
l_result ut_annotation_objs_cache_info;
30+
l_card natural;
2831
begin
32+
l_data := ut_annotation_cache_manager.get_annotations_objects_info(a_object_owner, a_object_type);
33+
l_card := ut_utils.scale_cardinality(cardinality(l_data));
34+
2935
l_cursor_text :=
30-
q'[select ]'||l_ut_owner||q'[.ut_annotation_obj_cache_info(
31-
object_owner => i.object_owner,
32-
object_name => i.object_name,
33-
object_type => i.object_type,
34-
needs_refresh => null
35-
)
36-
from ]'||l_ut_owner||q'[.ut_annotation_cache_info i
36+
'select /*+ cardinality(i '||l_card||') */
37+
value(i)
38+
from table( cast( :l_data as '||l_ut_owner||'.ut_annotation_objs_cache_info ) ) i
3739
where
3840
not exists (
39-
select 1 from ]'||l_objects_view||q'[ o
41+
select 1 from '||l_objects_view||q'[ o
4042
where o.owner = i.object_owner
4143
and o.object_name = i.object_name
4244
and o.object_type = i.object_type
43-
and o.owner = :a_object_owner
44-
and o.object_type = :a_object_type
45-
)
46-
and i.object_owner = :a_object_owner
47-
and i.object_type = :a_object_type]';
48-
open l_rows for l_cursor_text using a_object_owner, a_object_type, a_object_owner, a_object_type;
49-
fetch l_rows bulk collect into l_result limit 1000000;
45+
and o.owner = ']'||ut_utils.qualified_sql_name(a_object_owner)||q'['
46+
and o.object_type = ']'||ut_utils.qualified_sql_name(a_object_type)||q'['
47+
)]';
48+
open l_rows for l_cursor_text using l_data;
49+
fetch l_rows bulk collect into l_result limit gc_max_objects_limit;
5050
close l_rows;
5151
return l_result;
5252
end;
@@ -61,83 +61,48 @@ create or replace package body ut_annotation_manager as
6161
l_ut_owner varchar2(250) := ut_utils.ut_owner;
6262
l_objects_view varchar2(200) := ut_metadata.get_objects_view_name();
6363
l_cursor_text varchar2(32767);
64+
l_data ut_annotation_objs_cache_info;
6465
l_result ut_annotation_objs_cache_info;
65-
l_object_owner varchar2(250);
66-
l_object_type varchar2(250);
6766
begin
6867
ut_event_manager.trigger_event(
6968
'get_annotation_objs_info - start ( a_full_scan = ' || ut_utils.to_string(a_full_scan) || ' )'
7069
);
70+
71+
l_data := ut_annotation_cache_manager.get_annotations_objects_info(a_object_owner, a_object_type);
72+
7173
if not a_full_scan then
72-
l_cursor_text :=
73-
q'[select ]'||l_ut_owner||q'[.ut_annotation_obj_cache_info(
74-
object_owner => i.object_owner,
75-
object_name => i.object_name,
76-
object_type => i.object_type,
77-
needs_refresh => 'N'
78-
)
79-
from ]'||l_ut_owner||q'[.ut_annotation_cache_info i
80-
where i.object_owner = :a_object_owner
81-
and i.object_type = :a_object_type]';
82-
open l_rows for l_cursor_text using a_object_owner, a_object_type;
74+
l_result := l_data;
8375
else
84-
if a_object_owner is not null then
85-
l_object_owner := sys.dbms_assert.qualified_sql_name(a_object_owner);
86-
end if;
87-
if a_object_type is not null then
88-
l_object_type := sys.dbms_assert.qualified_sql_name(a_object_type);
89-
end if;
9076
l_cursor_text :=
91-
q'[select ]'||l_ut_owner||q'[.ut_annotation_obj_cache_info(
92-
object_owner => o.owner,
93-
object_name => o.object_name,
94-
object_type => o.object_type,
95-
needs_refresh => case when o.last_ddl_time < cast(i.parse_time as date) then 'N' else 'Y' end
96-
)
97-
from ]'||l_objects_view||q'[ o
98-
left join ]'||l_ut_owner||q'[.ut_annotation_cache_info i
77+
'select /*+ cardinality(i '||ut_utils.scale_cardinality(cardinality(l_data))||') */
78+
'||l_ut_owner||q'[.ut_annotation_obj_cache_info(
79+
object_owner => o.owner,
80+
object_name => o.object_name,
81+
object_type => o.object_type,
82+
needs_refresh => case when o.last_ddl_time < cast(i.parse_time as date) then 'N' else 'Y' end,
83+
parse_time => i.parse_time
84+
)
85+
from ]'||l_objects_view||' o
86+
left join table( cast(:l_data as '||l_ut_owner||q'[.ut_annotation_objs_cache_info ) ) i
9987
on o.owner = i.object_owner
10088
and o.object_name = i.object_name
10189
and o.object_type = i.object_type
102-
where o.owner = ']'||l_object_owner||q'['
103-
and o.object_type = ']'||l_object_type||q'['
90+
where o.owner = ']'||ut_utils.qualified_sql_name(a_object_owner)||q'['
91+
and o.object_type = ']'||ut_utils.qualified_sql_name(a_object_type)||q'['
10492
and ]'
10593
|| case
10694
when a_parse_date is null
10795
then ':a_parse_date is null'
10896
else 'o.last_ddl_time >= cast(:a_parse_date as date)'
10997
end;
110-
open l_rows for l_cursor_text using a_parse_date;
98+
open l_rows for l_cursor_text using l_data, a_parse_date;
99+
fetch l_rows bulk collect into l_result limit gc_max_objects_limit;
100+
close l_rows;
111101
end if;
112-
fetch l_rows bulk collect into l_result limit 10000000;
113-
close l_rows;
114102
ut_event_manager.trigger_event('get_annotation_objs_info - end (count='||l_result.count||')');
115103
return l_result;
116104
end;
117105

118-
function get_sources_to_annotate(a_object_owner varchar2, a_object_type varchar2) return sys_refcursor is
119-
l_result sys_refcursor;
120-
l_sources_view varchar2(200) := ut_metadata.get_source_view_name();
121-
begin
122-
open l_result for
123-
q'[select s.name, s.text
124-
from (select s.name, s.text, s.line,
125-
max(case when s.text like '%--%\%%' escape '\'
126-
and regexp_like(s.text,'--\s*%')
127-
then 'Y' else 'N' end
128-
)
129-
over(partition by s.name) is_annotated
130-
from ]'||l_sources_view||q'[ s
131-
where s.type = :a_object_type
132-
and s.owner = :a_object_owner
133-
) s
134-
where s.is_annotated = 'Y'
135-
order by s.name, s.line]'
136-
using a_object_type, a_object_owner, a_object_type, a_object_owner;
137-
138-
return l_result;
139-
end;
140-
141106
function get_sources_to_annotate(a_object_owner varchar2, a_object_type varchar2, a_objects_to_refresh ut_annotation_objs_cache_info) return sys_refcursor is
142107
l_result sys_refcursor;
143108
l_sources_view varchar2(200) := ut_metadata.get_source_view_name();
@@ -158,12 +123,12 @@ create or replace package body ut_annotation_manager as
158123
on s.name = r.object_name
159124
and s.owner = r.object_owner
160125
and s.type = r.object_type
161-
where s.type = :a_object_type
162-
and s.owner = :a_object_owner
126+
where s.owner = ']'||ut_utils.qualified_sql_name(a_object_owner)||q'['
127+
and s.type = ']'||ut_utils.qualified_sql_name(a_object_type)||q'['
163128
) s
164129
where s.is_annotated = 'Y'
165130
order by s.name, s.line]'
166-
using a_objects_to_refresh, a_object_type, a_object_owner;
131+
using a_objects_to_refresh;
167132

168133
return l_result;
169134
end;
@@ -257,7 +222,6 @@ create or replace package body ut_annotation_manager as
257222
procedure trigger_obj_annotation_rebuild is
258223
l_sql_text ora_name_list_t;
259224
l_parts binary_integer;
260-
l_object_to_parse ut_annotation_obj_cache_info;
261225
l_restricted_users ora_name_list_t;
262226

263227
function get_source_from_sql_text(a_object_name varchar2, a_sql_text ora_name_list_t, a_parts binary_integer) return sys_refcursor is
@@ -312,8 +276,6 @@ create or replace package body ut_annotation_manager as
312276
return;
313277
end if;
314278

315-
l_object_to_parse := ut_annotation_obj_cache_info(ora_dict_obj_owner, ora_dict_obj_name, ora_dict_obj_type, 'Y');
316-
317279
if ora_sysevent = 'CREATE' then
318280
l_parts := ORA_SQL_TXT(l_sql_text);
319281
build_annot_cache_for_sources(
@@ -324,9 +286,13 @@ create or replace package body ut_annotation_manager as
324286
build_annot_cache_for_sources(
325287
ora_dict_obj_owner, ora_dict_obj_type,
326288
get_source_for_object(ora_dict_obj_owner, ora_dict_obj_name, ora_dict_obj_type)
327-
);
289+
);
328290
elsif ora_sysevent = 'DROP' then
329-
ut_annotation_cache_manager.remove_from_cache(ut_annotation_objs_cache_info(l_object_to_parse));
291+
ut_annotation_cache_manager.remove_from_cache(
292+
ut_annotation_objs_cache_info(
293+
ut_annotation_obj_cache_info(ora_dict_obj_owner, ora_dict_obj_name, ora_dict_obj_type, 'Y', null)
294+
)
295+
);
330296
end if;
331297
end if;
332298
end;

source/core/annotations/ut_annotation_obj_cache_info.tps

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ create type ut_annotation_obj_cache_info as object(
1818
object_owner varchar2(250),
1919
object_name varchar2(250),
2020
object_type varchar2(250),
21-
needs_refresh varchar2(1)
21+
needs_refresh varchar2(1),
22+
parse_time timestamp
2223
)
2324
/

source/core/ut_metadata.pkb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ create or replace package body ut_metadata as
292292
if not l_result like '"%"' then
293293
l_result := upper(l_result);
294294
end if;
295-
return sys.dbms_assert.qualified_sql_name(l_result);
295+
return ut_utils.qualified_sql_name(l_result);
296296
end;
297297

298298
function get_anydata_compound_type(a_data_value anydata) return varchar2 is

source/core/ut_suite_manager.pkb

Lines changed: 14 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -401,20 +401,22 @@ create or replace package body ut_suite_manager is
401401
l_cursor_text varchar2(32767);
402402
l_result ut_varchar2_rows;
403403
l_object_owner varchar2(250);
404+
l_data ut_annotation_objs_cache_info;
404405
begin
405-
l_object_owner := sys.dbms_assert.qualified_sql_name(a_object_owner);
406+
l_object_owner := ut_utils.qualified_sql_name(a_object_owner);
407+
l_data := ut_annotation_cache_manager.get_annotations_objects_info(a_object_owner, 'PACKAGE');
406408
l_cursor_text :=
407409
q'[select i.object_name
408410
from ]'||l_ut_owner||q'[.ut_suite_cache_package i
409411
where
410412
not exists (
411-
select 1 from ]'||l_ut_owner||q'[.ut_annotation_cache_info o
413+
select 1 from table(:l_data) o
412414
where o.object_owner = i.object_owner
413415
and o.object_name = i.object_name
414416
and o.object_type = 'PACKAGE'
415417
)
416418
and i.object_owner = ']'||l_object_owner||q'[']';
417-
open l_rows for l_cursor_text;
419+
open l_rows for l_cursor_text using l_data;
418420
fetch l_rows bulk collect into l_result limit 1000000;
419421
close l_rows;
420422
return l_result;
@@ -516,15 +518,9 @@ create or replace package body ut_suite_manager is
516518
l_object_name varchar2(250);
517519
l_procedure_name varchar2(250);
518520
begin
519-
if a_object_owner is not null then
520-
l_object_owner := sys.dbms_assert.qualified_sql_name(a_object_owner);
521-
end if;
522-
if a_object_name is not null then
523-
l_object_name := sys.dbms_assert.qualified_sql_name(a_object_name);
524-
end if;
525-
if a_procedure_name is not null then
526-
l_procedure_name := sys.dbms_assert.qualified_sql_name(a_procedure_name);
527-
end if;
521+
l_object_owner := ut_utils.qualified_sql_name(a_object_owner);
522+
l_object_name := ut_utils.qualified_sql_name(a_object_name);
523+
l_procedure_name := ut_utils.qualified_sql_name(a_procedure_name);
528524
if a_path is null and a_object_name is not null then
529525
execute immediate 'select min(path)
530526
from '||l_ut_owner||q'[.ut_suite_cache
@@ -533,9 +529,7 @@ create or replace package body ut_suite_manager is
533529
and name = nvl(:a_procedure_name, name)]'
534530
into l_path using upper(l_object_owner), upper(l_object_name), upper(a_procedure_name);
535531
else
536-
if a_path is not null then
537-
l_path := lower(sys.dbms_assert.qualified_sql_name(a_path));
538-
end if;
532+
l_path := lower(ut_utils.qualified_sql_name(a_path));
539533
end if;
540534
l_suite_item_name := case when l_tags.count > 0 then 'suite_items_tags' else 'suite_items' end;
541535

@@ -804,12 +798,8 @@ create or replace package body ut_suite_manager is
804798
l_owner_name varchar2(250);
805799
l_package_name varchar2(250);
806800
begin
807-
if a_owner_name is not null then
808-
l_owner_name := sys.dbms_assert.qualified_sql_name(a_owner_name);
809-
end if;
810-
if a_package_name is not null then
811-
l_package_name := sys.dbms_assert.qualified_sql_name(a_package_name);
812-
end if;
801+
l_owner_name := ut_utils.qualified_sql_name(a_owner_name);
802+
l_package_name := ut_utils.qualified_sql_name(a_package_name);
813803

814804
refresh_cache(l_owner_name);
815805

@@ -894,15 +884,9 @@ create or replace package body ut_suite_manager is
894884
l_package_name varchar2(250);
895885
l_procedure_name varchar2(250);
896886
begin
897-
if a_owner_name is not null then
898-
l_owner_name := sys.dbms_assert.qualified_sql_name(a_owner_name);
899-
end if;
900-
if a_package_name is not null then
901-
l_package_name := sys.dbms_assert.qualified_sql_name(a_package_name);
902-
end if;
903-
if a_procedure_name is not null then
904-
l_procedure_name := sys.dbms_assert.qualified_sql_name(a_procedure_name);
905-
end if;
887+
l_owner_name := ut_utils.qualified_sql_name(a_owner_name);
888+
l_package_name := ut_utils.qualified_sql_name(a_package_name);
889+
l_procedure_name := ut_utils.qualified_sql_name(a_procedure_name);
906890

907891
refresh_cache(l_owner_name);
908892

source/core/ut_utils.pkb

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -865,5 +865,24 @@ create or replace package body ut_utils is
865865
return regexp_replace(a_item,a_prefix||a_connector);
866866
end;
867867

868+
function get_hash(a_data raw, a_hash_type binary_integer := dbms_crypto.hash_sh1) return t_hash is
869+
begin
870+
return dbms_crypto.hash(a_data, a_hash_type);
871+
end;
872+
873+
function get_hash(a_data clob, a_hash_type binary_integer := dbms_crypto.hash_sh1) return t_hash is
874+
begin
875+
return dbms_crypto.hash(a_data, a_hash_type);
876+
end;
877+
878+
function qualified_sql_name(a_name varchar2) return varchar2 is
879+
begin
880+
return
881+
case
882+
when a_name is not null
883+
then sys.dbms_assert.qualified_sql_name(a_name)
884+
end;
885+
end;
886+
868887
end ut_utils;
869888
/

0 commit comments

Comments
 (0)