گاهی اوقات نیاز است که کاربر نتواند اقدام به ALTER نمودن جداول نماید . در مثال زیر تمامی دسترسیهای کاربر به جز دستور TRUNCATE گرفته میشود.
CREATE OR REPLACE TRIGGER TEST.DDLTrigger
BEFORE DDL ON schema
BEGIN
if (ora_sysevent = 'TRUNCATE') then
null; -- I do not care about truncate
else
raise_application_error(-20000, 'YOU CAN NOT DO DDL!');
end if;
END;
/
روش دوم :
در مثال بالا با توجه به اینکه تریگر فوق بایستی در اسکیمای کاربر باشد ، در صورتی که کاربر اقدام به حذف و یا غیر فعال نمودن تریگر نماید ، دسترسی زدن DDL برایش باز میشود . حال در مثال زیر روشی را پیاده سازی میکنیم که از نظر امنیتی بهتر باشد. در حالت کلی با توجه به اینکه هر کاربر OWNER جداول خودش است نمیتوان دسترسی ALTER را از او گرفت . پس یک کاربر دیگر میسازیم و مراحل زیر را طی میکنیم.
1- ایحاد کاربر جدید (میتوان از اسکریپت ساخت کاربر قبلی کمک گرفت)
2- ایجاد SYNONYM از روی جداول کاربر قبلی(میتوان از اسکریپت زیر کمک گرفت)
3- دادن دسترسی های DML ای بر روی جداول اسکیمای قبلی
begin
for x in ( select table_name from DBA_TABLES where owner= 'TEST')
loop
dbms_output.put_line('CREATE OR REPLACE SYNONYM TEST2.' || x.table_name || ' FOR TEST.'|| x.table_name ||';');
dbms_output.put_line('GRANT DELETE, INDEX, INSERT, REFERENCES, SELECT, UPDATE, ON COMMIT REFRESH, QUERY REWRITE, DEBUG, FLASHBACK ON ACHDD5.' || x.table_name || ' TO TEST2;');
end loop;
end;