en-UShe-IL
You are here:   Blog
Register   |  Login

Blog Archive:

Maximize
* Can be used in order to search for older blogs Entries

Search in blogs


Blog Categories:

Maximize
* Can be used in order to search for blogs Entries by Categories

Blog Tags:

Maximize
* Can be used in order to search for blogs by keywords

TNWikiSummit


Awared MVP 


 


Microsoft® Community Contributor 


Microsoft® Community Contributor


 Read first, before you you use the blog! Maximize
אוק13

Written by: ronen ariely
13/10/2013 19:11 RssIcon

שאילתות DML עושות שימוש מאחורי הקלעים ב 2 טבלאות: inserted וכן deleted. שרתי SQL  מייצרים טבלאות אלו on-the-fly ומנהלים אותן. אלו טבלאות שנבנות ויושבות בזיכרון (memory-resident tables). משך החיים של טבלאות אלו הוא הטרנזקציה.

ניתן להשתמש בטבלאות אלו, על מנת לבצע פעולות על הנתונים ששונו בפעולת ה DML שלנו. לא ניתן להריץ שאילתות DML או DDL על טבלאות אלו ישירות (ז"א לא ניתן לשנות את הנתונים בהן או את המבנה שלהם) לכן לא נוכל למחוק/לשנות נתונים בטבלאות אלו או למשל להוסיף אינדקס. עם זה כן ניתן לבצע שאילתות בחירה על טבלאות אלו ולכן ניתן להשתמש בנתונים שלהם לביצוע פעולות על טבלאות קבועות או זמניות במסד הנתונים שלנו.

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

USE tempdb;
GO
 
------------------------------------- DDL
-- א. נייצר טבלה חדשה עליה נבצע פעולות
CREATE TABLE dbo.ArielyMainTbl
(
    id INT,
    employee VARCHAR(32)
)
go
 
-- ב. נייצר טבלת ארכיון שבה נשמור ארכיון של פעולות שבוצעו בטבלה הראשונה
-- שמו לב שטבלה זו זהה לטבלה הראשית שלנו עם טור נוסף שבו נכניס את הפעולה שביצענו בטבלה הראשית
-- לנמשל אם נכניס רשומה חדשה בטבלה הראשית אז נכניס כאן את המילה
-- inserted
-- אם נמחוק רשומה מהטבלה הראשית אז נכניס כאן את המילה
-- deleted
CREATE TABLE dbo.ArielyArchiveTbl
(
    id INT,
    employee VARCHAR(32),
    Operation VARCHAR(32)
)
go
 
------------------------------------- DML & using the INSERTED table
-- נכניס נתונים לטבלה הראשית שלנו
-- תוך כדי הכנסת הנתונים נשתמש בטבלה
-- INSERTED
-- על מנת לתפוס את כל הרשומות שאנחנו מכניסים
-- ואת הרשומות האלו נכניס גם לטבלה של הארכיון שלנו
insert dbo.ArielyMainTbl
OUTPUT inserted.id,inserted.employee,'inserted' INTO dbo.ArielyArchiveTbl
values (1, 'Tom'),(2, 'Alice'),(3, 'Ronen'),(4, 'Ariely')
GO
 
-- נבדוק מה יש לנו בכל טבלה
select * from dbo.ArielyMainTbl
select * from dbo.ArielyArchiveTbl
GO
 
 
------------------------------------- DML & using the DELETED table
-- נמחוק 2 רשומות מהטבלה הראשית שלנו
-- נעזר בטבלה
-- deleted
-- שנוצרת לנו באופן אוטומטי בזמן מחיקה כדי להכניס את כל הנתונים במוחקים אל טבלת הארכיון
-- בטבלת הארכיון נכניס את הפעולה שביצענו בטור האחרון
-- deleted
DELETE FROM dbo.ArielyMainTbl
OUTPUT deleted.id,deleted.employee,'deleted' INTO dbo.ArielyArchiveTbl
WHERE id = 1 OR id = 2;
GO
 
-- נבדוק מה יש לנו בכל טבלה
select * from dbo.ArielyMainTbl
select * from dbo.ArielyArchiveTbl
GO
 
------------------------------------- Clean
DROP TABLE dbo.ArielyMainTbl
DROP TABLE dbo.ArielyArchiveTbl
GO

קריאה מהנה :-)