برای پاسخ به این سوال باید اطلاعاتی راجع به مفهوم rowid داشته باشید
👈 این ستون (rowid) یک شبه ستون است که در تمامی جداول وجود دارد برای دریافت مقدار rowid باید نام آن را ذکر کنیم
select rowid , e.* from employees e
👈 مقدار rowid به ازای هر سطر از پایگاه داه یکتا است ، یعنی نمیتوان در پایگاه داده هیچ دو سطری را پیدا کرد که دارای یک rowid باشد
👈 این شبه ستون (rowid) در واقع آدرس محل فیزیکی ذخیره سازی رکورد را مشخص میکند که شامل مولفه هایی از جمله: نوع شی + شناسه Data File + شناسه Block + …
👈 کاربرد اصلی rowid در ایجاد ایندکس ها است ، هر نود ایندکس از دو مولفه value و rowid تشکیل میشود ، هنگامی که از ستونی که دارای ایندکس است در where استفاده میکنیم ابتدا استفاده از value در نودهای ایندکس فیلتر انجام میشود و سپس با استفاده از rowid به سطرهای مورد نظر دسترسی پیدا میکند
وجود ایندکس همانطور که برای سرعت اجرای پرس و جو ها مفید است ، در انجام DML ها باعث کند شدن میشود چون به ازای دستور DML باید ایندکس جدول به روز رسانی شود (rebuild) مه این کار میتواند سرباری برای انجام دستورات DML بوجود بیاورد
در جداولی که تعداد تراکنش های بالایی دارند (TPS بالایی دارند) وجود ایندکس میتواند باعث کندی عملکرد DML ها شود لذا از حداقل ایندکس برای آنها استفاده میشود
راه حل مناسب برای حذف داده از جداول حجیمی که ایندکس هم ندارند استفاده از insted of trigger است ، لطفا به کدهای ذیل دقت نمایید
create or replace view vw_emp_complex as
select e.rowid ri,
e.”employee_id”,
e.”first_name”,
e.”last_name”,
e.”email”,
e.”phone_number”,
e.”hire_date”,
e.”job_id”,
e.”salary”,
e.”commission_pct”,
e.”manager_id”,
e.”department_id”
from employees e;
/—————————————————–/
create or replace trigger trg_insted_on_vw_emp_com
instead of update on vw_emp_complex
for each row
begin
update employees e set e.salary = :new.SALARY where e.rowid = :old.ri;
end trg_insted_on_vw_emp_com;
✔️ در بخش اول کدهای مشاهده شده یک view ایجاد شده است که rowid هر سطر جدول کارمندان در آن قرار داده شده است
✔️ در بخش دوم مدهای بالا یک insted of trigger بر روی view ایجاد شده تعریف شده است که در شرط آن از rowid استفاده شده است
✔️ برای اصلاح داده ها میتوان به صورت زیر عمل کرد
update vw_emp_complex c
set c.salary = c.salary + 1100
where c.department_id = 80
✔️ پس از اجرای دستور update وارد کدهای تریگر شده و به دلیل اینکه در تریگر از rowid استفاده کرده ایم به سرعت میتوانیم به رکوردهای مورد نظر دسترسی پیدا کرده و اصلاح را انجام دهد
✔️ همانطور که مشاهده میکنید تریگر فوق به ازای هر سطر از دستور update که بر روی view اجرا میشود فراخوانی میگردد ، میتوان تریگر فوق را برای دستور delete نیز توسعه داد