برای تغییر نام یک کاربر در اوراکل، تا قبل از نسخه 11g، دستور مشخصی وجود نداشت و برای انجام این کار، نیاز بود تا از عملیات پرهزینه ای چون expdp/impdp، exp/imp و … استفاده کرد که البته استفاده از این روشها در بسیاری از محیطها، بسیار دشوار و تا حدودی نشدنی بود.
با در نظر داشتن این نکته، ممکن بود عده ای دست به کار پرریسکی بزنند که ان هم اصلاح و دستکاری جداول data dictionary بود در این روش، به طور مستقیم جدول user$ بروزرسانی خواهد شد البته انجام این کار، ممکن است در نسخه های مختلف، نتیجه های متفاوتی را به همراه داشته باشد و بعضا عملیات تغییر نام، به صورت ناقص انجام شود پس به طور کلی، استفاده از این روش به هیچ وجه منطقی بنظر نمی رسد و اجتناب از ان ضروری می باشد. با این حال، صرفا جهت اشنا شدن با این روش، با مثالی شیوه انجام ان را نشان خواهیم داد. در این مثال، نام کاربر usef به naser تغییر خواهد کرد.
قبل از اعمال هرگونه تغییرات، وضیعت جاری اشیاهای کاربر usef را بررسی می کنیم:
select user# from user$ where name=’USEF’;
86
select object_name,object_type,status from dba_objects where OWNER=’USEF’;
OBJECT_NAME | OBJECT_TYPE | STATUS |
TBL | TABLE | VALID |
TBL1 | TABLE | VALID |
MYPROC | PROCEDURE | VALID |
در این شیوه، ابتدا کاربر usef را حذف کرده و قبل از انجام commit، در همان session، کاربر دیگری با نام naser را اضافه می کنیم و در نهایت تغییرات را به اصطلاح commit می کنیم:
Oracle Database 10g Enterprise Edition Release 10.1.0.4.2 – Production
SQL> delete user$ where user#=86;
SQL> insert into user$ (USER#, NAME, TYPE#, PASSWORD, DATATS#, TEMPTS#, CTIME, PTIME, EXPTIME, LTIME, RESOURCE$, AUDIT$, DEFROLE, DEFGRP#, DEFGRP_SEQ#, ASTATUS, LCOUNT, DEFSCHCLASS, EXT_USERNAME, SPARE1, SPARE2, SPARE3, SPARE4, SPARE5, SPARE6)
values (86, ‘NASER’, 1, ‘6960C12A05241444′, 4, 3, to_date(’19-05-2018 18:01:56’, ‘dd-mm-yyyy hh24:mi:ss’), to_date(’19-05-2018 18:01:56′, ‘dd-mm-yyyy hh24:mi:ss’), null, null, 0, null, 1, null, null, 0, 0, ‘DEFAULT_CONSUMER_GROUP’, null, null, null, null, null, null, null);
SQL> commit;
SQL> alter system checkpoint;
SQL> alter system flush shared_pool;
بعد از انجام این تغییرات، رمز عبور کاربر naser را تغییر داده و به ان متصل می شویم:
SQL> alter user naser identified by a;
User altered.
SQL> conn naser/a
Connected.
همانطور که می بینید، اتصال به این کاربر، بدون خطا و به طور موفق انجام شد حال با دستور زیر، وضیعت اشیاهای متعلق به این کاربر را مورد بررسی قرار می دهیم:
select object_name,object_type,status from dba_objects where OWNER=’NASER’;
OBJECT_NAME | OBJECT_TYPE | STATUS |
TBL | TABLE | VALID |
TBL1 | TABLE | VALID |
MYPROC | PROCEDURE | INVALID |
همانطور که می بینید، پروسیجر myproc به دلیل استفاده از نام کاربر usef در متن کد، در وضیعت invalid قرار دارد:
create or replace procedure myproc is
begin
insert into usef.tbl1 values(1);
commit;
end;
توجه: تغییر در جداول data dictionary به صورت دستی، به هیچ وجه توسط اوراکل توصیه نمی شود(البته جداولی نظیر aud$ استثنا هستند).
تا قبل از اوراکل نسخه 11.2.0.2، کماکان محدودیت تغییر نام کاربران وجود داشت تا اینکه با امدن این نسخه از اوراکل، پارامتر مخفی ای به نام _enable_rename_user ارائه شد که تغییر نام را با کمک یک دستور، ممکن می ساخت(البته در حالت restricted session).
در مثال زیر، نام کاربر usef به ali تغییر خواهد کرد:
SQL> alter session set “_enable_rename_user”=true;
Session altered.
SQL> alter system enable restricted session;
System altered.
SQL> alter user usef rename to ali identified by a;
User altered.
SQL> alter system disable restricted session;
System altered.
قسمتی از خروجی فایل تریس مربوط به دستور alter user rename:
delete from user$ where user#=:1
insert into user$(user#,name,password,ctime,ptime,datats#,tempts#,type#,defrole,resource$,ltime,exptime,astatus,lcount,defschclass,spare1,spare4,ext_username,spare2)values (:1,:2,:3,SYSDATE,DECODE(to_char(:4, ‘YYYY-MM-DD’), ‘0000-00-00’, to_date(NULL), :4),:5,:6,:7,:8,:9,DECODE(to_char(:10, ‘YYYY-MM-DD’), ‘0000-00-00’, to_date(NULL), :10),DECODE(to_char(:11, ‘YYYY-MM-DD’), ‘0000-00-00’, to_date(NULL), :11),:12,:13,:14,:15,:16,:17,:18)
update user$ set user#=:1,password=:3,datats#=:4,tempts#=:5,type#=:6,defrole=:7,resource$=:8,ptime=DECODE(to_char(:9, ‘YYYY-MM-DD’), ‘0000-00-00’, to_date(NULL), :9),defschclass=:10, spare1=:11, spare4=:12 where name=:2
update user$ set exptime=DECODE(to_char(:2, ‘YYYY-MM-DD’), ‘0000-00-00’, to_date(NULL), :2),ltime=DECODE(to_char(:3, ‘YYYY-MM-DD’), ‘0000-00-00’, to_date(NULL), :3),astatus = :4, lcount = :5 where user#=:1
با اجرای این دستورات، خبری از کاربر usef در بانک نخواهد بود:
SQL> conn usef/a
ORA-01017: invalid username/password; logon denied
SQL> select * from dba_users where username=’USEF’;
no rows selected
و کاربر ali، مالک اشیاهای کاربر usef خواهد شد:
SQL> conn ali/a
Connected.
SQL> select table_name from dba_tables where owner=’ALI’;
TABLE_NAME
——————————
TBL
البته استفاده از این روش هم سبب invalid شدن پروسیجر myproc خواهد شد(به دلیل استفاده از نام کاربر usef در متن کد):
create or replace procedure myproc is
begin
insert into usef.tbl1 values(1);
commit;
end;
در پایان باید اشاره کرد که برای انجام تغییر نام یک کاربر به کمک دستور، در نسخه های 11g، 12c و 18c، نیاز به استفاده از پارامتر مخفی می باشد و البته این دستورات در مستندات رسمی اوراکل وجود ندارد.
بسیار عالی بود
سلام
متاسفانه این راه حل زمانی پاسخگو هستش که دسترسی به کاربری system یا sys داده شده باشه
بسیار عالی سپاسگزار