محافظت از View برای Insert و Update در اوراکل
هنگامی که یک View در اوراکل ایجاد می کنید و دارای شرط می باشد، براحتی می توان براساس برعکس آن شرط اطلاعات را ثبت و ذخیره کرد. حال برای جلوگیری از این عمل می توان از [WITH CHECK OPTION] در انتهای view استفاده کرد. برای درک بهتر به مثال زیر توجه کنیم:
create or replace view emp_view as
select * from emp
where deptno in(20,30);
select * from emp
where deptno in(20,30);
select * from emp;
Result:
BLAKE 2850 30
SCOTT 3000 20
KING 5000 10
Result:
BLAKE 2850 30
SCOTT 3000 20
KING 5000 10
select ENAME,SAL,DEPTNO
from emp_view;
Result:
BLAKE 2850 30
SCOTT 3000 20
from emp_view;
Result:
BLAKE 2850 30
SCOTT 3000 20
در این حالت می توانیم در اوراکل براحتی بدون هیچگونه محافظتی یک رکورد بر خلاف شرط از طریق View ایجاد کنیم.
insert into emp_view(ENAME,SAL,DEPTNO)
values('saeed','10000',10);
1 Row Inserted
insert into emp_view(ENAME,SAL,DEPTNO)
values('saeed','10000',10);
1 Row Inserted
برای محافظت، بدین صورت View را در اوراکل ایجاد می کنیم و در هنگام Insert با خطای زیر مواجه می شویم.
create or replace view emp_view as
select * from emp
where deptno in(20,30)
WITH CHECK OPTION;
select * from emp
where deptno in(20,30)
WITH CHECK OPTION;
insert into emp_view(ENAME,SAL,DEPTNO)
values('saeed','10000',10);
values('saeed','10000',10);
2 دیدگاه. پیغام بگذارید
سلام و خسته نباشید
این روش فقط جلوی insert را میگیرد. درست است؟ اگر update ای با همان شروط ویو صورت گیرد خطایی برنمیگرداند؟
در ضمن می توانید به مطلب option: with read only را نیز اضافه فرمایید که کاملتر شود.
متشکرم
با سلام خدمت دوست گرامی
در ابتدا تشکر می کنم برای اینکه نظر خودتان را اظهار میکنید.
بله. امکان ایجاد رکورد جدید در صورتیکه که خارج از شرط ویو باشد نمی دهد. در واقع هدف این است که نتوان خارج از شرط ویو عملیات بر روی View ایجاد گردد. نه اینکه اصلا نتوان عملیاتی را انجام داد.
در واقع علت اینکه در هدر مطلب کلمه update را آوردم می خواستم اشاره کنم که دوستان نگران بروزرسانی اطلاعات ، خارج از شرط های ویو نباشد. شما وقتی عمل update را انجام می دهید به رکورد موجود در ویو اشاره می کنید و اگر وجود نداشته باشد در واقع یعنی اصلا موجودیت ندارد و هیچ رکوردی بروز نمی شود و خطا هم نمی دهد.
با تشکر از شما برای اضافه کردن این Option. کاربرد آن برای مواقعی است که کلا نمی خواهیم از طریق این View عملیات INSERT, UPDATE, DELETE صورت گیرد.