יום חמישי, 18 בדצמבר 2008

מציאת כל הTriggers בבסיס נתונים

שלום לכולם,

לעיתים תכופות מאוד, אני יוצר Triggers בבסיסי נתונים של Sql Server.
מאוד נוח לי לעבוד איתם וזה גם משפר ביצועים ופחות קריאות מהאפליקציה.

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

כמובן שישנם עוד שימושים אבל לא ניכנס אליהם כרגע, זה לא הנושא של הPost.

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

כאן ניתן למצוא את הטריגרים: (בד"כ)

לManagement Studio של Sql אין מקום מובנה שבו ניתן לראות את כל הTriggers כמו שניתן לראות Stored Procedures, אבל כן ניתן לכתוב Script שימצא לנו את כולם.

הנה הוא:

SELECT myTriggers.[name] TableName, Triggers.[name] TriggerName, 
CASE 
WHEN myTriggers.deltrig = Triggers.id  THEN 'Delete' 
WHEN myTriggers.instrig = Triggers.id THEN 'Insert' 
WHEN myTriggers.updtrig = Triggers.id THEN 'Update' 
END 'TriggerType'
FROM sysobjects Triggers JOIN sysobjects myTriggers ON Triggers.parent_obj = myTriggers.[id] WHERE Triggers.xtype='TR'

כך תוכלו למצוא בקלות את הTriggers שיש לכם בכל בסיס נתונים.

כך גם אם מתכנתים אחרים צריכים לעבוד על אותו בסיס נתונים, אני ממליץ להם למצוא כך את הTriggers ולהבין את הלוגיקה ה"חבויה" יותר של בסיס הנתונים - בהצלחה

** נבדק על Sql 2005, Sql2000.

בהצלחה

יום שבת, 13 בדצמבר 2008

onmouseout אמיתי בJavascript

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

נסביר.
נניח שיש לנו Div בPosition Relative ובתוכו Div אחר בPosition Absolute.
בתוך הdiv הזה, יש לנו לצורך העניין לינקים.

אנחנו רוצים, שכאשר העכבר יוצא מהDiv הזה, נסתיר אותו.

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


הDiv הצהוב הוא הDiv שלנו בPosition:relative, ובתוכו ישנו Div בPosition Absolute.
כך נראה הCss של הדף שלנו.


body
{
width:100%;
}
.mainContainer
{
width:100%;
text-align:center;
}
.mainContainer .content
{
width:500px;
height:500px;
margin:auto;
background-color:Yellow;
position:relative;
}
.mainContainer .content .innerFloatingDiv
{
position:absolute;
top:0px;
left:0px;
background-color:#CCCCCC;
width:200px;
height:200px;
}



עכשיו, תרחיש פשוט, נחבר פונקציה לOnMouseOut של הDiv האפור ונציג Alert "אתה בחוץ" כאשר אנחנו יוצאים ממנו.
כך זה נראה.
בואו ונראה מה הבעיה,



אחרי שראיתם כאן בדיוק מה הבעיה, בוא ונראה כיצד ניתן לפתור אותה בצורה קלה ביותר.
לתוך הפונקציה שלנו שמקבלת את הOnMouseOut נוסיף פרמטר שהוא בעצם האובייקט שלנו (הDiv).
נחבר את האובייקט הזה לפונקציה שתחזיר לנו True - אם העכבר באמת יצא מהגבולות של האובייקט, וFalse אם לא.

בצורה כזו
כך הפעלנו קודם את הפונקציה.



div class="innerFloatingDiv" onmouseout="displayAlertOnRollOut()"

עכשיו, אנו נפעיל אותה כך, בעקבותיה באות הפונקציות בJavascript.


div class="innerFloatingDiv" onmouseout="displayAlertOnRollOut(this)"

function displayAlertOnRollOut(obj)
{
if(isMouseRealyOutOfObject(obj))
{
alert('אתה בחוץ');
}
}
function isMouseRealyOutOfObject(obj)
{
if (!window.event)
return true;
var event = window.event;
var oFrom = event.fromElement;
var oTo = event.toElement;
return (obj == oFrom || obj.contains(oFrom)) && !obj.contains(oTo) && obj != oTo;
}


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

בהצלחה!

תרגישו חופשי לומר לי אם משהו לא הלך.