Иногда диву даешься, как исхитряются пользователи/программисты. Предлагаю собирать тут коллекцию, я надеюсь ее и сам пополнять, поскольку потом сам забываю случившиеся приколы, а некоторые из них хорошо бы держать при аудите перед глазами.
Ну, всем известный пример индус-style кода (ничего не имею против индусов, но они первые начали) :)
Берется для отчета какой-нибудь select x from table where a=b. Потом бизнес просит какие-то модификации относительно отчета и, естественно, быстро. Редко кто парится, да? Обычно делают select y from (select x from table where a=b) where y=c... Естественно, что условия множатся и паровод вперед летит, как работает предыдущее разбираться не хочется, но нужно еще подфильтровать и уже поднаторевшие в генерации простынь программист рождает что-то вроде with badquery as (select y from (select x from table where a=b) where y=c)... Со временем простыня становится совершенно нечитаемой и косты исчисляются миллиардами. Причем, переделать это практически невозможно, поскольку поколения сотрудников могли многократно смениться, а запросы содержать код каких-то функций, которые уже никто не помнит, что делают. Пресекать такое лучше на излете...
Второе, что интересное вспомнилось - права пользователей. Пользователь просит права на доступ к табличке с очень чувствительными данными. Это проверенный пользователь, работающий много лет в компании и ни разу не выносивший свой ноутбук за пределы. Он проходит согласование безопасников, руководства, в общем, нудное согласование, длящееся иногда неделю и, наконец, получает доступ к данным. Они ему очень нужны для работы и анализа в определенном наборе, поэтому он делает create view myview as select * from secret_table where x=y, после чего радостно хлопает в ладоши и ... делает grant select on myview to public, потому, что результатом труда хочет поделиться с коллегами :) :) Внимательно проверяйте, что пользователь и кому грантует...
Вот, для законченности мысли, как отобрать все это у конкретного пользователя:
SQL код:
begin
for c in (SELECT GRANTEE, PRIVILEGE, OWNER,TABLE_NAME FROM DBA_TAB_PRIVS
WHERE GRANTEE NOT IN (SELECT GRANTEE FROM DBA_ROLE_PRIVS)
AND GRANTEE NOT IN (SELECT GRANTED_ROLE FROM DBA_ROLE_PRIVS)
AND OWNER in ('ИМЯ') and grantee='PUBLIC' order by 1)
Loop
begin
execute immediate 'revoke '||c.privilege||' on '||c.owner||'.'||c.table_name||' from public';
end;
end loop;
end;