BI&BigData
  • Register
תנו לנו לייק וקבלו עדכונים ישירות לפיד

דירוג משתמשים: 0 / 5

Star inactiveStar inactiveStar inactiveStar inactiveStar inactive
 

מושג שרובנו שמענו, אבל לא תמיד יישמנו הוא מושג הOracle Synonym מה זה בעצם ?כיצד ניתן ליישם? מה היתרונות? 

 באורקל נהוג ליצור שם משתמש אפלקטיבי אשר מהווה את  "בעל הבית" של האובייקטים , כגון טבלאות, DB Views ועוד.

מאחר ויוזר זה הוא חזק מאד ושימוש לא נכון בו, הן במזיד והן לא, יכול לגרום לנזקים משמעותים לאפליקציה, נהוג לתת למשתמשים יוזר חלש יותר אשר יכול לפנות לאובייקטים של היוזר האפלקטיבי, אך בהבדל אחד. יש לציין את שם הסכמה האפלקטיבית לפני שם האובייקט. בואו נראה דוגמא:

נניח שיצרנו יוזר אפלקטיבי בשם Encyclopedia_Prod עם טבלה אחת בשם Sales, כלומר הSQL יהיה:

drop user encyclopedia_prod cascade;
create user encyclopedia_prod identified by 123456;
grant connect to encyclopedia_prod;
grant resource to encyclopedia_prod;
grant create any table to encyclopedia_prod;
ALTER SESSION SET CURRENT_SCHEMA = encyclopedia_prod;
CREATE TABLE "ENCYCLOPEDIA_PROD"."SALES" ("NAME" VARCHAR2(40 BYTE), "SALES_AMT" NUMBER, "SALES_DATE" DATE, env VARCHAR2(40 BYTE)) ;
REM INSERTING into ENCYCLOPEDIA_PROD.SALES
SET DEFINE OFF;
Insert into ENCYCLOPEDIA_PROD.SALES (NAME,SALES_AMT,SALES_DATE,env) values ('dwh',100,to_date('09-APR-18','DD-MON-RR'),'prod');
Insert into ENCYCLOPEDIA_PROD.SALES (NAME,SALES_AMT,SALES_DATE,env) values ('co',200,to_date('17-APR-18','DD-MON-RR'),'prod');
Insert into ENCYCLOPEDIA_PROD.SALES (NAME,SALES_AMT,SALES_DATE,env) values ('il',300,to_date('25-APR-18','DD-MON-RR'),'prod');
commit;

 אם נכנס לתוך יוזר encyclopedia_prod נוכל לאחזר נתונים מטבלת sales שיצרנו באמצעות משפט sql פשוט. למשל:

select * from sales

 אך מה קורה כאשר ניצור יוזר נוסף וניתן לו הרשאות קריאה לטבלת sales מencyclopedia_prod?

ניצור יוזר כזה בשם user_read וניתן לו הרשאות קריאה לטבלת Sales. להלן:

 

drop user user_read cascade;
create user user_read identified by 123456;
grant connect to user_read;
grant resource to user_read;
grant create any table to user_read; grant select on ENCYCLOPEDIA_PROD.SALES to user_read;

 

 כעת אם נכנס באמצעות היוזר השני , user_read, לא נוכל לאחזר מטבלת Sales באמצעות

 

 

select * from sales



כי הרי טבלת sales יכולה להיות קיימת בהרבה סכמות אחרות באותו DB, לכן נצטרך להוסיף את שם הסכמה לפני שם הטבלה, כלומר:

 

 

select * from encyclopedia_prod.sales




אז מה זה בעצם Synonym?

הרעיון בSynonym הוא יצירת אובייקט בסכמה המפנה לאובייקט אחר. בדוגמא שראינו נוכל ליצור אובייקט בסכמת הקריאה user_read אשר יפנה באופן אוטומטי לאובייקט בסכמה encyclopedia_prod.

ניצור Synonym על יוזר user_read באמצעות הפקודה הבאה:


ALTER SESSION SET CURRENT_SCHEMA = user_read;
CREATE or replace SYNONYM sales FOR encyclopedia_prod.sales;
 
עכשיו יצרנו בתוך הסכמה user_read אובייקט הפונה לאובייקט בסכמה encyclopedia_prod.

כעת אם נכנס עם היוזר user_read, נוכל לכתוב את הselect מקודם ללא ציון שם הסכמה, כלומר:

select * from sales



הסבר : כעת sales הוא לא טבלת sales אלא synonym המוגדר בסכמה user_read המפנה לטבלה בעלת שם זהה בסכמת encyclopedia_prod.
מאחר והSynonym הוא אובייקט בuser_read ניתן לגשת אליו מuser_read ללא ציון שם הסכמה.

מדוע בעצם להשתמש בSynonym?

לכאורה הסיבה המרכזית היא נוחות, כלומר נוכל ליצור אובייקט שיחסוך מאיתנו את כתיבת שם הסכמה לפני פניה לאובייקטים מסכמה אחרת. למרות שסיבה זאת נכונה , ישנה סיבה טובה יותר. הרעיון בSynonym מביא לידי ביטוי רעיון נשגב הקיים במחשבים בכלל:

עדיף להשתמש באובייקטים לוגים מאשר אובייקטים פיזים.

לצורך הדוגמא, נניח כי סביבת הפיתוח שלנו נמצאת בסכמה אחרת באותו DB. ניצור טבלה עם שם זהה:

 

create user encyclopedia_dev identified by 123456;

grant connect to encyclopedia_dev;
grant resource to encyclopedia_dev;
grant create any table to encyclopedia_dev;
ALTER SESSION SET CURRENT_SCHEMA = encyclopedia_dev;

CREATE TABLE SALES
( "NAME" VARCHAR2(40 BYTE),
"SALES_AMT" NUMBER,
"SALES_DATE" DATE,
"ENV" VARCHAR2(40 BYTE)
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "SYSTEM" ;
REM INSERTING into ENCYCLOPEDIA_PROD.SALES
SET DEFINE OFF;
Insert into ENCYCLOPEDIA_PROD.SALES (NAME,SALES_AMT,SALES_DATE,ENV) values ('dwh2',100,to_date('09-APR-19','DD-MON-RR'),'prod');
Insert into ENCYCLOPEDIA_PROD.SALES (NAME,SALES_AMT,SALES_DATE,ENV) values ('co3',200,to_date('17-APR-18','DD-MON-RR'),'prod');
Insert into ENCYCLOPEDIA_PROD.SALES (NAME,SALES_AMT,SALES_DATE,ENV) values ('il3',300,to_date('25-APR-18','DD-MON-RR'),'prod');
commit;
grant select on sales to user_read;

 

מנקודה זאת, לא נצטרך לשנות את האפליקציה כדי שתגש לאותה טבלה מסביבת הפיתוח אלא שהאפליקציה תיגש לSynonym ואנו נשנה את הSynonym לprod\dev באמצעות סקריפט פשוט -אחד לכל סביבה:

יורץ בuser_read

CREATE or replace SYNONYM sales FOR encyclopedia_prod.sales;
CREATE or replace SYNONYM sales FOR encyclopedia_dev.sales;

רעיון זה נראה מינורי כשמדובר על טבלה אחת, אך כשמדובר באפליקציה מכילה מאות אובייקטים ועברה קומפילציה, יתרון זה הוא בולט ומקל מאד על העבודה.

הערה חשובה לסיום: ישנה Synonym ציבורי, כלומר Synonym המשמש לגישה בכל אחד מהסכמות. סוג זה נקרא public synonym ונוצר באמצעות הפקודה:

 

CREATE or replace public SYNONYM sales FOR encyclopedia_prod.sales;

 

 

 

 

 

 

 

Sap

Oracle

Informatica

SAS

Microstrategy

IBM

Microsoft

Qlikview

Teradata

Webfocus

התחברות

x
יצירת חשבון
x

קליק אחד ואתם מחוברים. מהיר .קל .מאובטח.

מעניין? שתפו דף זה באמצעות הטלפון הנייד

מאמר בעברית: oracle synonyms...המדריך המפורט עם דוגמאות - QR Code Friendly
Powered by QR Code Friendly

מאמרים

מגמות של ביג דאטה בעולם הביטוח
CA Technologies
SSIS - Buffer Size Optimization
קטגוריה ראשית
בדיקות BI ו-DWH לעומת הבדיקות בתחומים אחרים
קטגוריה ראשית
איסוף דרישות לפרויקטי BI
קטגוריה ראשית
כח המידע במיקוד
קטגוריה ראשית
0

הדף שלנו בפייסבוק

התחברות

חדש בישראל

כניסות למאמרים
7170966