استفاده از یک sequence در چند جدول

نکته: توی distirbuted table می‌توانیم یک sequence‌ مشترک داشته باشیم.

به مثال زیر توجه کنید:

SQL> create table t2(id number, name varchar2(30));
Table created.
SQL> insert into t2(id, name) values(s1.nextval, 'ss');
1 row created.
SQL> select * from t2;
ID         NAME
---------- ------------------------------
11 ss

در این مثال از sequence ساخته شده در مثال قبل برای یک جدول دیگر استفاده کرده‌ایم. از این خاصیت می‌توان در خیلی جاها که نیاز به ادامه دادن تراکنش‌ها از یک جدول در یک جدول دیگر داریم استفاده کنیم.

۲۵ ارديبهشت ۹۴ ، ۱۳:۳۷ ۰ نظر
مهدی غفاری

استفاده از Sequence در Insert

به مثال زیر دقت کنید:

SQL> select * from t1;
ID         NAME
---------- --------------------
1 mohammad
3 mohsen
SQL> insert into t1 values (s1.nextval, 'javad');
1 row created.
SQL> select * from t1;
ID         NAME
---------- --------------------
8 javad
1 mohammad
3 mohsen
SQL> insert into t1 values (s1.nextval, 'javadssssssssssssssssssssssssssssssssss
sssssssssssssssssssss');
insert into t1 values (s1.nextval, 'javadsssssssssssssssssssssssssssssssssssssss
ssssssssssssssss')
*
ERROR at line 1:
ORA-12899: value too large for column "MAHDI"."T1"."NAME" (actual: 60, maximum:
20)
SQL> insert into t1 values (s1.nextval, 'mahdi');
1 row created.
SQL> select * from t1;
ID         NAME
---------- --------------------
8 javad
10 mahdi
1 mohammad
3 mohsen

در مثال بالا به این مسئله پی بردیم که چون sequence به صورت transactional نیست ما id شماره ۹ را به خاطر faile شدن تراکنش از دست داده‌ایم.

در حقیقت sequence جلو می‌رود بدون توجه به اینکه تراکنش انجام می‌شود یا نه پس همیشه حرکت رو به جلو رو داره.

۲۵ ارديبهشت ۹۴ ، ۱۳:۳۲ ۰ نظر
مهدی غفاری

Sequence چیست؟

sequence یک شمارنده در اوراکل است که همیشه در حال شمارش است. به مثال زیر توجه کنید:

SQL> SELECT S1.NEXTVAL FROM DUAL;
NEXTVAL
----------
1
SQL> SELECT S1.NEXTVAL FROM DUAL;
NEXTVAL
----------
2
SQL> SELECT S1.NEXTVAL FROM DUAL;
NEXTVAL
----------
3
SQL> SELECT S1.NEXTVAL FROM DUAL;
NEXTVAL
----------
4
SQL> SELECT S1.NEXTVAL FROM DUAL;
NEXTVAL
----------
5
SQL> SELECT S1.NEXTVAL FROM DUAL;
NEXTVAL
----------
6

نکته: SEQUNCE به صورت TRANSACTIONAL نیست.

SQL> ROLLBACK;
Rollback complete.
SQL> SELECT S1.NEXTVAL FROM DUAL;
NEXTVAL
----------
7
۲۵ ارديبهشت ۹۴ ، ۱۳:۰۹ ۰ نظر
مهدی غفاری

پاک‌کردن محفظه سطل‌بازیابی

برای اینکار از دستور زیر استفاده کنید:

SQL> purge table mahdi.t9;
Table purged.

همچنین برای پاک کردن کل محفظه سطل بازیابی می‌توانید از دستور زیر استفاده کنید:

SQL> PURGE recyclebin;
Recyclebin purged.

نکته: دقت کنید که اگر purge کنید دیگر اطلاعات قابل بازیابی نیست.

۲۵ ارديبهشت ۹۴ ، ۱۰:۵۵ ۰ نظر
مهدی غفاری

برگرداندن آبجکت از سطل بازیابی با flashback

برای اینکار به مثال زیر توجه کنید:

SQL> flashback table MAHDI.t9 to before drop;
Flashback complete.
SQL> describ t9;
Name Null? Type
----------------------------------------- -------- ---------------------
 ID                                                  NUMBER
NAME VARCHAR2(20)
FAMILY VARCHAR2(20)

۲۵ ارديبهشت ۹۴ ، ۱۰:۴۹ ۰ نظر
مهدی غفاری

سطل بازیابی در اوراکل (dba_recyclebin)

به مثال زیر توجه کنید:

SQL> CONNECT MAHDI;
Connected
Connection created by CONNECT script command disconnected
SQL> DESCRI T9;
DESCRI T9
ERROR:
-------------------------------
ERROR: object T9 does not exist
SQL> CREATE TABLE T9(ID NUMBER, NAME VARCHAR2(20), FAMILY VARCHAR2(20));
table T9 created.
SQL> DROP TABLE T9;
table T9 dropped.
SQL> SELECT object_name ,droptime ,original_name ,owner from dba_recyclebin ;
OBJECT_NAME DROPTIME ORIGINAL_NAME OWNER
-------------------------------------------------- ------------------- ----------------------- ----------
BIN$uPBAMAcxSEKbICnDjzXV1Q==$0 2015-05-15:09:46:16 T9 MAHDI
BIN$d9S76pNMSmiI/fISqrthNQ==$0 2015-05-15:09:51:55 T9 MAHDI

OBJECT_NAME = شماره هر آبجکت چون امکان داره شما چندتا جدول با اسم‌های یکسان drop کرده باشید و این فیلد به ما تفاوت هر آبجکت رو نشون میده.

DROPTIME = زمان حذف آبجکت

ORIGINAL_NAME = اسم اصلی آبجکت

OWNER = مالک آبجکت

۲۵ ارديبهشت ۹۴ ، ۱۰:۰۹ ۰ نظر
مهدی غفاری

ساخت Flashback برای مدت ۲ سال

با استفاده از دستور زیر یک Flashback دو ساله ساخته می‌شود و در Tablespace TBS2 نگهداری می‌شود.

CREATE FLASHBACK ARCHIVE fla2 TABLESPACE tbs2 RETENTION 2 YEAR;

نکته: حتما توجه داشته باشید که Tablespace موردنظر را در اوراکل از قبل ایجاد کرده باشید.

برای تغییر Flashback به دوسال می‌توانید از دستور زیر استفاده کنید:

ALTER FLASHBACK ARCHIVE fla2 MODIFY RETENTION 2 YEAR;
۲۲ ارديبهشت ۹۴ ، ۱۷:۴۲ ۰ نظر
مهدی غفاری

لیست تغییرات جدول توسط کاربران

س: لیست تغیراتی که کاربران بر روی جدول T1 داده‌اند را نمایش دهید:

ج: با استفاده از کوئری زیر می‌توانید به این هدف برسید.

SQL> select commit_timestamp , logon_user, XID from flashback_transaction_query
where table_NAME='T1';
COMMIT_TI LOGON_USER                     XID
--------- ------------------------------ ----------------
12-MAY-15 MAHDI 02000000B8090000
12-MAY-15 MAHDI 02000000B8090000
12-MAY-15 MAHDI 02000000B8090000
12-MAY-15 MAHDI 08001C00C6090000

گزارش بالا لیست commitهایی که کاربران رو سطح دیتابیس رو جدول t1 انجام داده‌اند.

نکته: این گزارش نمونه‌ای از اطلاعات دیتادیکشنری است. همچنین همانطور که مشاهده می‌کنید این گزارش از flashback_transaction_query گرفته شده است.

XID = شماره پیگیری transaction است.

نمایش لیست فیلدهای جدول flashback_transaction_query

SQL> describ flashback_transaction_query;
Name Null? Type
----------------------------------------- -------- -----------------
XID                                                 RAW(8)
START_SCN NUMBER
START_TIMESTAMP DATE
COMMIT_SCN NUMBER
COMMIT_TIMESTAMP DATE
LOGON_USER VARCHAR2(30)
UNDO_CHANGE# NUMBER
OPERATION VARCHAR2(32)
TABLE_NAME VARCHAR2(256)
TABLE_OWNER VARCHAR2(32)
ROW_ID VARCHAR2(19)
UNDO_SQL VARCHAR2(4000)

نکته: اگر در حالت audit نباشید فیلد undo_sql, row_id اطلاعاتی در خود ندارد.

در حقیقت برای پیداکردن شماره تراکنش از این جدول استفاده می‌کنیم. بعداً توسط یک دیتادیکشنری دیگه می‌توانید شماره تراکنش را بدهید و دقیقاً بفهمید اون تراکنش ثبت شده در حقیقت چه کارهایی بر روی سطح دیتابیس انجام داده است.

۲۲ ارديبهشت ۹۴ ، ۱۷:۳۰ ۰ نظر
مهدی غفاری

برگشت به یک زمان خاص بدون بک‌آپ - Oracle Flashback

دامیومنت

Setup and Maintenance for Oracle Flashback Database

مقدمه

اوراکل با استفاده از فایلهای redo می‌تواند تا زمانی که فایلهای redo برای داده‌های موردنظر شما دوباره‌نویسی نشده باشند بدون داشتن backup دیتاهای حذف شده شما را برگرداند.

SQL> drop user mahdi cascade;
User dropped.
SQL> create user mahdi identified by qwerty512;
User created.
SQL> grant dba, connect to mahdi;
Grant succeeded.
SQL> connect mahdi
Enter password:
Connected.
SQL> password
Changing password for MAHDI
Old password:
New password:
Retype new password:
Password changed
SQL> create table t1(id number, name varchar2(20));
Table created.
SQL> insert into t1 values(1, 'mohammad');
1 row created.
SQL> insert into t1 values(2, 'mahdi');
1 row created.
SQL> insert into t1 values(3, 'mohsen');
1 row created.
SQL> commit;
Commit complete.
SQL> select * from t1;
ID         NAME
---------- --------------------
1 mohammad
2 mahdi
3 mohsen
SQL> delete from t1 where id=2;
1 row deleted.
SQL> commit;
Commit complete.
SQL> select * from t1;
ID NAME
---------- --------------------
1 mohammad
3 mohsen
SQL> SELECT * FROM t1 AS OF TIMESTAMP TO_TIMESTAMP('2015-05-12 16:55', 'YYYY-MM-
DD HH24:MI:SS');
ID         NAME
---------- --------------------
1 mohammad
3 mohsen
SQL> SELECT * FROM t1 AS OF TIMESTAMP TO_TIMESTAMP('2015-05-12 16:50', 'YYYY-MM-
DD HH24:MI:SS');
no rows selected
SQL> SELECT * FROM t1 AS OF TIMESTAMP TO_TIMESTAMP('2015-05-12 16:51', 'YYYY-MM-
DD HH24:MI:SS');
ID         NAME
---------- --------------------
1 mohammad
2 mahdi
3 mohsen

نکته: توجه داشته باشید اگر بخواهید محدودیتی برای flashback نداشته باشید فقط در صورتی که هارد پرسرعت و فضای کافی ذخیره‌سازی در اختیار دارید می‌توانید دیتابیس را در حالت archive قرار دهید. برای قرار دادن دیتابیس در حالت archive می‌توانید به صورت زیر عمل کنید:

SQL> connect sys as sysdba
Enter password:
Connected.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 3240239104 bytes
Fixed Size 2407880 bytes
Variable Size 1879048760 bytes
Database Buffers 1342177280 bytes
Redo Buffers 16605184 bytes
Database mounted.

نکته: در موقع flashback می‌توانید از دستوراتی نظیر where نیز استفاده کنید:

SQL> SELECT * FROM mahdi.t1 AS OF TIMESTAMP TO_TIMESTAMP('2015-05-12 16:51', 'YY
YY-MM-DD HH24:MI:SS') WHERE id>0;
ID         NAME
---------- --------------------
1 mohammad
2 mahdi
3 mohsen

ذخیره اطلاعات

برای ذخیره اطلاعات می‌توانید به شکل زیر عمل کنید:

SQL> create table t3(id number, name varchar2(20));
Table created.
SQL> INSERT INTO T3 SELECT * FROM mahdi.t1 AS OF TIMESTAMP TO_TIMESTAMP('2015-05
-12 16:51', 'YYYY-MM-DD HH24:MI:SS');
3 rows created.
SQL> select * from t3;
ID         NAME
---------- --------------------
1 mohammad
2 mahdi
3 mohsen
SQL> commit
2 ;
Commit complete.

پیداکردن اختلاف بین ۲ جدول

برای اینکار می‌توانید از minus به شکل زیر استفاده کنید:

SQL> select * from t3 minus select * from mahdi.t1;
ID         NAME
---------- --------------------
2 mahdi

نکته: minus یعنی مجموعه اول را از مجموعه دوم کم کن و خروجی را نمایش بده.

س: اگر ساختار جدول تغییر کرد می‌توان با استفاده از flashback اطلاعات را بازیابی کرد؟

ج: خیر، چون فیلدهایی که در اون بازه زمانی در redo موجود بوده‌اند با ساختار مشخصی از جدول ثبت شده‌اند و اگر بخواهیم در یک جدولی که ساختار یکسانی با آنچه ثبت شده است اطلاعات را ذخیره کنیم به مشکل برخواهیم خورد چون اطلاعات دیگر منطبق بر CTL فایل‌ها نیست.

س: وقتی flashback را enable می‌کنیم اجازه میدیم که flashback از redo فایل archive بگیره؟ 

ج: بله

۲۲ ارديبهشت ۹۴ ، ۱۷:۰۳ ۰ نظر
مهدی غفاری

برگرداندن پروفایل

داکیومنت

ALTER USER

Administering User Privileges, Roles, and Profiles

برای برگرداندن یک کاربر به پروفایل پیش‌فرض خود می‌توانید از دستور زیر استفاده کنید:

ALTER USER username PROFILE DEFAULT;

همجنین برای پاک کردن پروفایل می‌توانید از دستور زیر استفاده کنید:

DROP PROFILE app_user CASCADE;

۲۲ ارديبهشت ۹۴ ، ۱۵:۱۹ ۰ نظر
مهدی غفاری