۴ مطلب با کلمه‌ی کلیدی «create table» ثبت شده است

سطل بازیابی در اوراکل (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 = مالک آبجکت

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

برگشت به یک زمان خاص بدون بک‌آپ - 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 بگیره؟ 

ج: بله

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

کمی بیشتر درباره View

مزیت‌های View

1 . می‌توان پرس و جوی پیچیده پیاده‌سازی کرد. 2 . ارتباط مستقیم کاربران را با جداول حذف کرد.

ورود داده در View

SQL> CREATE TABLE TBL1(ID NUMBER, NAME VARCHAR2(20));
Table created.
SQL> CREATE VIEW V1 AS SELECT * FROM TBL1;
View created.
SQL> INSERT INTO V1(ID, NAME) VALUES(1, 'MAHDI');
1 row created.
SQL> COMMIT;
Commit complete.

س: اگر view ما ترکیبی باشه به چه صورت باید insert را انجام دادا؟

ج: با pl/sql می‌توان insert را انجام داد، چون insert ما باید قاعده view رو رعایت کنه و روی ضرب دکارتی تاثیر نذاره

س: اگر در دستورمان Aggregate functions داشته باشیم(توابعی مانند Sum و Countو...) می‌توان با view از آنها استفاده کرد؟

ج: خیر

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

جداول بسیار حجیم در Very Large Databaseها (انواع پارتیشن‌بندی)

به index گذاری که روی سطح لایه فیزیکی دیتابیس باشه اصطلاحاً پارتیشن‌بندی گفته می‌شود.

partition by range

به مثال زیر دقت کنید، در این مثال جدولی با پارتیشن بر مبنای فیلدهای id, age ساخته‌ایم:

SQL> create table sal (id number,age number,name varchar2(20))
partition by range(id,age)
(partition s1 values less than (10,20) tablespace ts1,
partition s2 values less than(20,30) tablespace ts2,
partition s3 VALUES LESS THAN (MAXVALUE) tablespace ts3);

در ادامه گفته‌ایم که مقدارهای ورودی در پارتیشن s1 باید کمتر از 10,20 باشند و این پارتیشن در tablespace ts1 قرار دارد(یعنی idهای کمتر از ۱۰ و ageهای کمتر از ۲۰)

در ادامه پارتیشن s2 را داریم که مقدارهای کمتر از 20,30 را در خود می‌گیرد و در tablespace ts2 قرار دارد.

و در ادامه پارتیشن s3 را داریم که اگر رکوردی وارد شد که تو بازه‌ی پارتیشن‌بندی ما نبود اون رکورد که حالا معلوم نیست بزرگه یا کوچیکه وارد tablespace ts3 شود.

نکته: اسم پارتیشن‌ها زیاد اهمیتی برای ما ندارند.

نکته: اگر عملیات update انجام شود و مقدار عوض شود جابه‌جایی در پارتیشن نیز رخ خواهد داد.

نکته: تو partition by range بهتره که تمام فیلدها مشخص شوند، یعنی چیز نامعلومی که کاربر بخواد وارد کنه و به مشکل بخوره نباشه

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