منبع اصلی نوشتار زیر در این لینک قرار دارد

امنیت در لایه Database

همانطور که قبلاً قول داده بودم،‌الوعده وفا..! اگر به خاطر داشته باشید قرار بر این شد که دو سری مقالات به مقالات سایت اضافه شود،‌ یکی مقالات پایه FreeBSD که دو مطلب انتشار یافت و همچنان ادامه دارد و دومین سری مقالات بنا بر مقالات Hardening بود. این مطلب اولین شماره مقالات Hardening می‌باشد تا … ادامه خواندن امنیت در لایه Database ادامه مطلب

منبع اصلی نوشتار زیر در این لینک قرار دارد

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

ادامه مطلب

منبع اصلی نوشتار زیر در این لینک قرار دارد

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

ادامه مطلب

منبع اصلی نوشتار زیر در این لینک قرار دارد

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

س: لیست تغیراتی که کاربران بر روی جدول 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 فایل‌ها نیست. 

ادامه مطلب

منبع اصلی نوشتار زیر در این لینک قرار دارد

جستجوی انعطاف‌پذیر

نکته: دیتابیس اوراکل قابلیت PREPARE STATEMENT رو ساپورت میکنه

هرگاه بخواهیم در دستور SELECT خود، از کاربر ورودی دریافت نماییم، از & استفاده می‌کنیم. برای این مثال، از جدول PERSON استفاده خواهیم‌کرد.

دستور زیر تمام رکورد‌های جدول PERSON را به شرطی که فیلد NAME آن مساوی با ورودی کاربر باشد لیست می‌کند. دقت داشته باشید، بعد از اجرای کوئری پایگاه‌داده از شما مقدار ورودی را خواهد پرسید، به دستور زیر توجه کنید:

در پرس‌وجوی فوق از کاربر ورودی گرفته می‌شود، سپس جستجو در جدول PERSON آغاز می‌گردد و در انتها خروجی را به کاربر نمایش می‌دهد:

SELECT * FROM T5 WHERE AGE = &PLEASE_ENTER_YOUR_AGE;
ENTER VALUE FOR PLEASE_ENTER_YOUR_AGE: 10
AGE NAME
---- ------------
10 HOSSEIN

حالا می‌خوام INJECT کنم، می‌بینید که INJECT را قبول میکنه!!

نکته: من از قصد علامت & رو گذاشتم تا SQL INJECT رو قبول کنه ولی در فصل‌های آینده به این موضوع می‌رسیم که چجوری جلوی INJECT را در PREPARE STATEMENT بگیریم و دیگه دستور SQL رو به عنوان ورودی نگیره:

SELECT * FROM T5 WHERE AGE = &PLEASE_ENTER_YOUR_AGE;
ENTER VALUE FOR PLEASE_ENTER_YOUR_AGE: 10 OR 1=1
AGE NAME
---- ----------
50 HAMID
20 AKBAR
10 HOSSEIN
30 HOSSEIN
15 AKBAR

ادامه مطلب

منبع اصلی نوشتار زیر در این لینک قرار دارد

تغییر داده‌ها با استفاده از UPDATE

دستور UPDATE این امکان را به شما می‌دهد تا بتوانید، داده‌های مورد نظرتان را تغییر دهید. برای مثال از جدول PERSON استفاده می‌کنیم.

SELECT *
FROM PERSON;
NAME       FAMILY                AGE  ID_PERSON
---------- ------------ ------------ -----------
MOHAMMAD GHAFFARI 23 1
MAHDI GHAFFARI 21 2
MOHSEN GHAFFARI 19 3
FARZAD KARKHANI 25 4
EHSAN JALALI 23 5

حال با استفاده از دستور UPDATE، افرادی را که نام آن‌ها EHSAN می‌باشد را تغییر، و ALI را جایگزین آن می‌نماییم.

UPDATE PERSON
SET NAME = 'ALI';
WHERE NAME = 'EHSAN';
1 row updated.

جدول PERSON را مشاهده کنید.

ادامه مطلب
ادامه مطلب

منبع اصلی نوشتار زیر در این لینک قرار دارد

توابع پردازش رشته – Soundex

نوع: فانکشن چند RESULT ای (به ازای هر رکورد یک مقداری بر می‌گرداند)

دسته: فانکشن‌های پردازش رشته

این فانکشن تلفظ یک رشته را بر می‌گرداند. به عبارت دیگر، اگر به دنبال کلمه‌ای می‌گردید، که تلفظ درست آن را نمی‌دانید، می‌توانید از این تابع استفاده کنید.

مثال:

CREATE TABLE T2(NAME VARCHAR2(20));
INSERT INTO T2 VALUES ('MAHDI');
INSERT INTO T2 VALUES ('EHSAN');
INSERT INTO T2 VALUES ('FARZAD');
COMMIT;

ادامه مطلب
ادامه مطلب

منبع اصلی نوشتار زیر در این لینک قرار دارد

توابع گروهی – Sum, Avg, Max, Min

این فانکشن‌ها به ازای داده‌های یک فیلد، فقط یک مقدار را بر می‌گردانند. در این بخش، برخی از توابع گروهی را به شما معرفی می‌کنیم. برای این قسمت، از جدول PERSON استفاده می‌کنیم:

SQL> SELECT * FROM PERSON;

NAME FAMILY AGE ID-PERSON
-------- ----------- ------------- ----------
MOHAMMAD GHAFFARI 23 1
MAHDI GHAFFARI 21 2
MOHSEN GHAFFARI 19 3
FARZAD KARKHANI 26 4
EHSAN JALALI 23 5

ادامه مطلب
ادامه مطلب

منبع اصلی نوشتار زیر در این لینک قرار دارد

توابع ریاضی – EXP, Log, Ln

EXP

شما می‌توانید بوسیله‌ی این تابع از فرمول e استفاده نمایید. لازم به ذکر است که، e یک عدد ثابت ریاضی می‌باشد (e = 2.71828…). این تابع عدد e را به توان x می‌رساند. به دستور زیر توجه کنید.

SELECT NUM_1, EXP(NUM_1) FROM NUMBERS;
NUM_1 EXP(NUM_1)
----- ----------
15 3269017.37
5 148.413159
51 1.44093E+22
46 9.4961E+19
28 1.4463E+12
37 1.1719E+16

ادامه مطلب
ادامه مطلب