הבלוג של גרי רשף

30/08/2011

היררכיית האובייקטים והבעלות (Owner) עליהם

Filed under: Uncategorized — גרי רשף @ 19:14

כל מי שעובר מ-SQL Server ל-Oracle או להיפך- הולך קצת לאיבוד בהתחלה בגלל ההבדלים בהיררכיית האובייקטים בין שתי הסביבות: ב-Oracle אין דטבייסים, ואת מקומם ממלאות הסכימות שאינן רק דרך לארגן את האובייקטים אלא מציינות בעלות עליהם, ובמילים אחרות- ב-Oracle אין הפרדה בין דטבייס & סכימה & משתמש, הם שלושתם אותו הדבר (מקווה שאינני מפספס שום דבר- לא ראיתי Oracle בשנה האחרונה), וכשמשתמש יוצר טבלה- היא נוצרת כברירת מחדל בסכימה שלו והוא הבעלים (Owner) שלה.

ב-SQL Server הדברים שונים. עד גרסה 2000 לאובייקטים היה Owner, אבל מאז גרסה 2005 אין זה כך, האובייקטים שייכים לסכימה בדטבייס ולא למשתמש, ורק הסכימה עצמה שייכת למשתמש (בדרך כלל זה ה-dbo שהוא ה-Owner של הדטבייס והסכימה).
למשל- אם מבטלים משתמש על ידי Drop User – אין כל בעייה עם האובייקטים שהוא יצר והם ימשיכו להתקיים בלעדיו, אך כן תהיה בעייה עם הסכימות המשוייכות לו.
דוגמה:

Create Login MyLogin With Password='MyLogin',Check_Policy=Off;
Go

Create User MyUser For Login MyLogin With Default_Schema=MySchema;
Go

Create Schema MySchema Authorization MyUser;
Go

Select  P.name [User_Name],
        P.type_desc,
        L.name Login_Name,
        P.default_schema_name,
        S.name [Owned_Schema_Name]
From    sys.database_Principals P
Inner Join sys.syslogins L
        On P.sid=L.sid
Left Join sys.schemas S
        On P.principal_id=S.principal_id
Where   P.name='MyUser';

clip_image002

יצרנו Login (המשתמש ברמת השרת),

User המשוייך לו (המשתמש ברמת הדטבייס),

Schema המשוייכת ל-User.

השליפה מציגה את האובייקטים שיצרנו,

כאשר יש להבדיל בין Default_Schema_Name המציינת מהי סכימת ברירת המחדל של ה-User (אם לא צויין ב-Create User אזי זו סכימה dbo),

ו-Owned_Schema_Name המציינת את הבעלות על הסכימה (אם לא צויין ב-Create Schema אזי בעל הסכימה הוא dbo).

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

בנוסף- dbo מציין גם User וגם סכימה, ולא במפתיע היא ברירת המחדל שלו והוא ה-Owner שלה..

כדי ליצור אובייקטים – למשל טבלאות – יש לתת ל-User הרשאות מתאימות: גם הרשאה ליצור טבלה וגם הרשאה להשתמש בסכימה.

הרשאה ליצור טבלה נותנים כך:

Grant Create Table To MyUser;
Go

הרשאות לסכימה אין צורך לתת מכיוון ש-MyUser הוא ה-Owner של MySchema ויש לו הרשאות מלאות, אך אם לא- ניתן למשל כך:

Grant Control On Schema::MySchema To MyUser;
Go

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

Execute As User='MyUser';
Go

Create Table MyTable(I Int);
Go

Revert;

Select  name Table_Name,
        Schema_Name(schema_id) [Schema_Name]
From    sys.tables
Where   name='MyTable';

clip_image004

יצרנו טבלה בתור MyUser והיא נוצרה ב-MySchema.

לסיום נבטל בסדר הפוך את האובייקטים שיצרנו:

Drop Table MySchema.MyTable;
Go

Drop Schema MySchema;
Go

Drop User MyUser;
Go

Drop Login MyLogin;
Go

את הטבלה יש לבטל כדי שיהיה ניתן לבטל את הסכימה בתוכה היא נמצאת.

את הסכימה יש לבטל כדי שיהיה ניתן לבטל את ה-User שהוא ה-Owner שלה, אם כי אין קשר ישיר של בעלות בין ה-User והטבלה, ולו היא הייתה נוצרת בסכימה שאינה שלו- לא היה צורך לבטלה.

את ה-User יש לבטל כדי שניתן יהיה לבטל את ה-Login.

מודעות פרסומת

להגיב »

עדיין אין תגובות.

RSS feed for comments on this post. TrackBack URI

כתיבת תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s

בלוג בוורדפרס.קום.

%d בלוגרים אהבו את זה: