‏הצגת רשומות עם תוויות SQL SERVER 2005. הצג את כל הרשומות
‏הצגת רשומות עם תוויות SQL SERVER 2005. הצג את כל הרשומות

יום שני, 9 בפברואר 2015

Did you know that SQL Server 2005 support ends April 12, 2016 ?

Microsoft would like you to have the latest and greatest tools available as you embark on your upgrade journey. 
 
The great news is that several new tools and migration options are now available:
 
  • SQL Server 2014 Upgrade Advisor supports 2005, 2008, 2008 R2, and 2012, and enables you to plan for a direct upgrade path from any of these versions to SQL Server 2014.
 
  • SQL Server 2014 Upgrade Guide is newly published, and has complete information on how to plan, execute, and validate your upgrade to SQL Server 2014 across a variety of workloads.
 
 
 

יום ראשון, 11 בדצמבר 2011

MORE VRP - Variance

שלום רב,

לאחרונה הוזמנתי לבית מייקרוסופט להרצות בנוגע ליכולות החדשות ב- SQL Server 2012.
בהפסקה ניגש אליי DBA ושאל אותי בנוגע לבעיה שמאוד מוכרת לנו מנהלי בסיסי הנתונים : במהלך העבודה השוטפת אנו מנהלי בסיסי הנתונים ניתקלים במקרים בהם אנו צריכים לשנות משהו בבסיס הנתונים (בהגדרות של השרת, SQL Server העלאות גרסה, עדכונים, שדרוגים וכו'...) ולא תמיד אנו יודעים האם שיפרנו את הביצועים או לא...
כמו-כן, יש מקרים ש"פתאום" יש לנו גריעה בביצועים וכמובן שכל הצוות ישר עונה שהוא לא שינה כלום... ואנו לא יודעים מה השתנה מאז אתמול שהכל היה תקין...
הדגשתי ל- DBA חשוב שגם ידע שזה שהמשתמשים שלו לא מתלוננים לאחר הפעילות - זה לא אומר שהם מרוצים! בהחלט יכול להיות שהם פשוט התאיישו מביצועי בסיס הנתונים...
אז עניתי ל-DBA שכמובן שאפשר לאסוף מדדים ע"י ה- prefmon ושאר ה- DMV ... אך מה נעשה כאשר נרצה לעשות הסבה מאורקל ל- SQL Server ? או מה נעשה כאשר לא הספקנו לאסוף את המדדים לפני השינוי? או שלא אספנו את המדד הנכון?

בעיה..? אז זהו שלא!

כידוע יש את ה- MORE VRP (שגילוי נאות מדובר בפתרון מבית וראסיטי , אך מה לעשות שמדובר בכלי טוב שיכול לחסוך לנו מנהלי בסיסי הנתונים הרבה זמן וכסף...).
ב- MORE VRP מלבד היתו פתרון לניהול משאבי בסיסי הנתונים בזמן אמת (http://www.morevrp.com/) אשר הוא שווה כמה פוסטים בפני עצמו... יש בו גם את המנגנון המעולה : Variance.
בעזרת ממשק הגרפי והידידותי של מודול ה- Variance אפשר להשוות בין מסדי נתונים שונים בתקופות זמן שונות!
ה- Variance מגיע עם מגוון של כלים אנליטיים כל זאת כדי להצביע לנו על הדמיון והשוני בין הסביבות ולזהות את הסיבות לפערים ואת השפעתם על הביצועים.
המודול מאפשר ניתוח השוואתי מתוחכם של הנתונים שנאספו במאגר על פי מגוון של פרמטרים שונים.

לסיכום,
תמו להם הימים בהם היינו מבצעים שינוי בבסיס הנתונים והיינו מחכים לטלפונים של המשתמשים על מנת לקבל מהם פידבק...
מהיום ניתן להשוות את הביצועים בין תאריכים וסביבות באופן מדוייק ומהיר!
לפרטים נוספים אודות המודול: http://www.morevrp.com/products/modules/18-product-modules/analytics-modules/33-variance



בהצלחה.

http://blogs.microsoft.co.il/blogs/itaib/archive/2011/12/11/more-vrp-variance.aspx

יום שני, 11 ביולי 2011

כמה ימי ראשון יש בין שני תאריכים?

שלום רב,




שאלה:
יש לי מערכת לחישוב שעות עבודה המבוססת כמובן בסיס נתונים מסוג sql server :) .
בחברה שלנו מוגדר כי יום ראשון בשבוע הינו חצי יום עבודה ולכן על מנת לחשב שעות נוספות ליום עבודה ספציפי זה , אני צריך לחשב כמה ימי ראשון יש לי בין שני תאריכים.
כיצד ניתן לחשב ב - sql server כמה ימי ראשון לדוגמא יש לי בין שני תאריכים?




תשובה:
על מנת לחשב כמה ימי ראשון, ובכלל כמה "שמות" ימים יש לי בין שני תאריכים אני אקרא בהתחלה לפונקציות dateadd ו- datename על מנת לקבל את מספר היום -
datename(weekday,dateadd(day,number,@date1).
לאחר מכן, אני אעזר בטבלת המערכת master..spt_values אשר מכילה כ- 2500 פרמטרים על מנת לפענח את שם היום.




הפתרון הינו:




declare @date1 datetime, @date2 datetime
select
@date1='2011-07-01', @date2='2011-07-11'
select
sum(case when datename(weekday,dateadd(day,number,@date1))='sunday' then 1 else 0 end)
as sundays,
sum(case when datename(weekday,dateadd(day,number,@date1))='Monday' then 1 else 0 end)
as Monday,
sum(case when datename(weekday,dateadd(day,number,@date1))='Tuesday' then 1 else 0 end)
as Tuesday,
sum(case when datename(weekday,dateadd(day,number,@date1))='Wednesday' then 1 else 0 end)
as Wednesday,
sum(case when datename(weekday,dateadd(day,number,@date1))='Thursday' then 1 else 0 end)
as Thursday,
sum(case when datename(weekday,dateadd(day,number,@date1))='Friday' then 1 else 0 end)
as Friday,
sum(case when datename(weekday,dateadd(day,number,@date1))='Saturday' then 1 else 0 end)
as Saturday
from master..spt_values
where type='p' and dateadd(day,number,@date1)<=@date2



כמובן שאפשר עוד לייעל את השליפה. ובמידה ויש לכם רעיונות נוספים לפתרון הבעיה אשמח לשמוע!!
בהצלחה!



יום שישי, 18 בפברואר 2011

SQL Search

שלום רב,

כידוע לכם ישנם מאות מוצרים משלימים ותומכים ל- sql server ולשאר פלטפורות ה- DB בכלל רובם כמובן עולים כסף...ולפעמים הרבה כסף..
לכן, הפעם ברצוני לסקור בפניכם כלי חינמי מצויין שאני אישית ולקוחותיי נעזרים בו רבות - SQL Search של חברת Red-Gate .

דרך אגב, לחברת redgate יש בין היתר עוד מוצר מצויין ולא יקר בשם : HyperBac.
לכלי הזה יתרונות רבים וסיקרתי אותו בעבר בבלוג:
http://itaibinyamin.blogspot.com/2009/08/hyperbac-db-hyperbac-online.html

ה-SQL Search הינו בעצם תוסף ל- SQL Server Management Studio אשר בעזרתו ניתן לחפש במהירות על-פי שם האובייקט (קטעי קוד, טבלאות , וכו'...) ולפי מילות מפתח שבתוך קטעי הקוד בבסיסי הנתונים השונים.
עוד יכולת מצויינת של הכלי הינו שכאשר לוחצים לחיצה כפולה על התוצאה המבוקשת - הכלי מביא אותנו ישירות לקטע הקוד המבוקש , ובכך בעצם אנו חוסכים זמן יקר בחיפוש ופתיחת הקובץ.




לינק להורדת הכלי: http://www.red-gate.com/products/sql-development/sql-search/

בהצלחה.

יום רביעי, 16 בפברואר 2011

SSDs – are they really a solution for database performance issues?

Most of the databases with which I am familiar – still reside on rotating plates (A.K.A disks). Disks, physical disks, hard drives or whatever else you might call them – have been out there for many years, and they are one of the few products that haven’t really developed in a technological sense. Moore’s Law never really applied to disks. Only CPU power. Too bad… because when it comes to the amount of calculation a CPU can execute in a single second – we are making a great leap every 18 months, but when it comes to the amount of IO/sec we can process even when using a high-quality storage device – the mechanics that work underneath are still stuck somewhere in the late 80s or early 90s.

Recently, there is another new buzz catching everyone’s attention. This one is around SSD drives. Solid State Drives. SSDs are really good when what you want to do is to read a lot of data. They are especially good (in comparison to physical rotating disks) when you want to read a lot of data in small chunks – what is also called “Random IO”. I’ve had an opportunity to work with databases that reside on SSD drives or what are also called Flash devices. I’ve worked with databases stored on Flash drives, Flash cache, Oracle Exadata, and many other solutions. They all have one property in common: when the disk operates faster, the CPU tends to work harder to process the huge stream of data.

Up until now, physical disks have been the main bottleneck to performance improvement in most of the systems with which I have worked. But when you substitute the IO sub-system with an alternative that is capable of executing so-and-so many IO operations per second, instead of the disk being the bottleneck, instead this role goes to the CPU. I’ve seen this in real life.

Here is an example: I was working on a system with 4 Quad CPUs and SAN storage that was capable of processing 10,000 IO/sec tops. • When my disk capacity was 100% utilized, my average CPU utilization was ~40% on average, and it peaked at 70%. • When I replaced the storage system with an SSD that was capable of processing 100,000 IO/sec (ie 10 times faster than my old storage), I noticed that my CPU consumption was still ~40% on average, but it peaked at 100%! • Another thing that I noticed was that even though the SSD capacity is 100,000 IO/sec, it never went beyond a speed of 20,000 IO/sec (meaning that it was only 20% utilized). Why was that? Because now I don’t have enough CPU power to process this fast data stream… Now we all know what happens when a machine reaches 100% CPU utilization… it crashes, times out, hangs… And if someone runs a report on this machine, if before it would have jammed only the storage device, now it jams the machine’s CPU…

Now tell me something – if you have to choose from between these two options, which one would you prefer?

• working with a jammed, over-utilized storage device?

• Working with a jammed, over-utilized CPU?

I would choose the second option. Because even when my hard drive on my laptop is working hard, most of the applications that reside in my memory and consume only CPU are still working fine. But when my CPU is 100% utilized – the laptop is completely stuck. No processing ability, not to process IO, nor to carry out CPU calculations.

People told me “SSD is going to solve our performance problems”. Well… – no. It sure will speed up some of the things that you are doing. But it is not going to solve the other problem from which you probably suffer – that of QoS and SLA. As long as there are computers, performance bottlenecks will remain. If you make one component work faster without changing anything else, the bottleneck will simply move to one of the other components.

The only way you can avoid the bottleneck and guarantee QoS in this case is by controlling the amount of resources each and every transaction takes… whether the resources are CPU or IO. It doesn’t matter if your problem is CPU or IO – MoreVRP will allow you to safeguard your QoS and SLA. Until today there doesn’t seem to be an overall solution to eliminate the bottleneck… but by using MoreVRP, you can make sure that it doesn’t affect your most critical transactions. No matter if you are working with SSDs or good old physical disks.

Something to think about the next time you consider buying a new storage device.

Cheers.

http://www.more-resource.com/blog/?p=74

יום ראשון, 19 בדצמבר 2010

Microsoft SQL Server 2005 Service Pack 4 RTM

שלום רב,

מייקרוסופט שחררה עדכון sp4 לגרסת sql server 2005 .

Service Pack 4 (SP4) for Microsoft SQL Server 2005 is now available for download. SQL Server 2005 service packs are cumulative, and this service pack upgrades all service levels of SQL Server 2005 to SP4 . You can use these packages to upgrade any of the following SQL Server 2005 editions:

Enterprise
Enterprise Evaluation
Developer
Standard
Workgroup


SQL Server 2005 SP4 includes SQL Server 2005 SP3 cumulative update 1 to 11, customer requested fixes, along with instances of the SQL Server 2005 SP4 database Engine support for DAC operations.

להלן רשימת הבאגים שנפתרו:

http://support.microsoft.com/kb/2463332

להורדת הקובץ:

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=b953e84f-9307-405e-bceb-47bd345baece


בהצלחה

יום ראשון, 24 באוקטובר 2010

SUSER_SNAME

שלום רב,

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

שאלה:
ברצוני להוסיף בפרוצדורה תנאים לביצוע ע"פ המשתמש אשר מריץ את הפרוצדורה – האם זה אפשרי?
האם ניתן לקבוע ערך DEFAULT לעמודה בטבלה שמשמעו "מי ביצע את הפעולה" ?

תשובה:
פלטפורמת SQL SERVER 2005 מכילה פונקציות מערכת רבות ומגוונות, אחת הפונקציות השימושיות הינה : SUSER_SNAME.

להלן מספר יכולות הפונקציה :
1. הפונקציה מחזירה את ה- log in שמריץ את הפונקציה , לדוגמא:




2. הפונקציה יכולה לתרגם את ה- login security identification number לשם המשתמש , לדוגמא:



ניתן לשלב את הפונקציה כתנאי בתוך פרוצדורה , וניתן לשלב את הפונקציה ב- DEFAULT constraint בתוך טבלה, לדוגמא:


בהצלחה !
http://blogs.microsoft.co.il/blogs/itaib/archive/2010/10/24/suser-sname.aspx

יום חמישי, 29 ביולי 2010

לאיזה PORT אני מאזין ???

שלום רב,

שאלה:
כיצד אני יכול לדעת לאיזה port האינסטנס של ה- sql server שלי מאזין?


תשובה:
ישנן מספר אפשרויות לזהות מהו ה- Port שה- sql server מאזין אליו:

1.registry - אפשרות ראשונה אשר לא מקובלת אך מאוד יעילה הינה דרך ה- registry של שרת ה- sql server.

SQL 2005 :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.\MSSQLServer\
SuperSocketNetLib\TCP\

SQL 2008 :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10.\MSSQLServer\
SuperSocketNetLib\TCP\



2. xp_readerrorlog - אפשרות שנייה הינה לקרוא את ה- log של ה- sql server.

בעת העלייה של האינסטנס נרשם לתוך ה- Log ה- Port אליו הוא מאזין. על מנת למצוא את הרשומה המתאימה - תחפשו את הערך "Server is listening on".



3. וכמובן האפשרות המקובלת - SQL Server Configuration Manager - תחת אופציית SQL Server Network Configuration - ניתן לראות את מספר ה- Port תחת הגדרות ה- tcp\ip.


בהצלחה.

יום שלישי, 6 ביולי 2010

JOIN לא שווה - רק דומה....

שלום רב,

שאלה:
יש לי שתי טבלאות בבסיס הנתונים אשר אני רוצה לבצע להם JOIN אך לצערי אין לי שדה מקשר...
כלומר: השדה בטבלה הראשונה הינו "חלק" מהשדה בטבלה השנייה.
לדוגמא: בטבלה הראשונה יש לי עמודה השומרת שם פרטי+שם משפחה ואילו בטבלה השנייה יש לי עמודת שם פרטי בלבד.
כיצד ניתן לבצע join בין שתי הטבלאות?

תשובה:
נהוג לחשוב כי ביצוע Join בין שתי טבלאות הינן רק כאשר שתי העמודות בשתי הטבלאות זהות.
אז זהו שלא... :)
ניתן לשלב במשפט ה- join בעת החיבור בין העמודות - LIke.

לדוגמא:
נקים שתי טבלאות:

טבלה ראשונה תייצג שמות פרטיים של העובדים:

CREATE TABLE [dbo].[t_names](
[name] [nvarchar](50) NULL
) ON [PRIMARY]
GO
INSERT [dbo].[t_names] ([name]) VALUES (N'itai')
INSERT [dbo].[t_names] ([name]) VALUES (N'ziki')
INSERT [dbo].[t_names] ([name]) VALUES (N'david')

הטבלה השנייה תייצג שמות מלאים של העובדים:

CREATE TABLE [dbo].[t_full_names](
[full_name] [nvarchar](50) NULL
) ON [PRIMARY]
GO
INSERT [dbo].[t_full_names] ([full_name]) VALUES (N'itai binyamin')
INSERT [dbo].[t_full_names] ([full_name]) VALUES (N'zipi')
INSERT [dbo].[t_full_names] ([full_name]) VALUES (N'haya')
INSERT [dbo].[t_full_names] ([full_name]) VALUES (N'veracity group')

במידה ונריץ את המשפט השליפה הבא לא נקבל תשובות מהסיבה שהעמודות הינן שוות (למרות שהן זהות בחלקם...):
SELECT *
FROM t_names INNER JOIN
t_full_names ON t_names.name = t_full_names.full_name

לכן, במידה ונרצה לבצע join בין שתי עמודות שאינן שוות אך זהות בחלקן , נריץ את משפט ה- select כך:

SELECT *
FROM t_names INNER JOIN
t_full_names ON t_full_names.full_name like t_names.name+'%'

בהצלחה!

יום שלישי, 29 ביוני 2010

SQL Server Best Practices

שלום רב,

כידוע מייקרוסופט מפרסמת מידי פעם מסמכי Best Practices למוצריה.
לכן, על מנת לעשות סדר - להלן קישור אשר מרכז את כל המסמכים הללו.

המסמכים כוללים הנחיות, עצות מומחים, והכוונה בנוגע ליישום הטכנולוגיות.

http://technet.microsoft.com/en-us/sqlserver/bb671430.aspx

בהצלחה.

יום חמישי, 22 באפריל 2010

סיפור לקוח : כא”ל לנהל נכון

שלום רב,

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

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

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

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

ב-Cal ביצענו פרויקט שבמסגרתו רוכזו היישומים לסביבת מחשוב מרכזית בתצורת Cluster, מבוססת Windows Server 2003/2008 ו-SQL Server 2005/2008 (גרסאות 2008 הושקו במהלך הפרויקט, שארך כשנה). כשותף מבצע נבחרה חברת ורסיטי, לאחר שהוכיחה מקצועיות ושירותיות ברמה גבוהה בפרויקטים קודמים ב-Cal. "הם הוכיחו יכולת לעמוד ביעדי זמן ותקציב, וידענו כי מובטחת לנו המשכיות לאורך זמן" מוסיף דביר.

"כתוצאה מהמהלך, מספר השרתים הפיזיים הצטמצם בצורה משמעותית - והוא מקיף כיום פחות ממחצית מסך השרתים הקודם", אומר איתי בנימין, מנהל פרויקטים ו-DBA בוראסיטי, ומציין: "כחלק מהפרויקט, אף בוצעה הפרדה מסודרת לסביבות עבודה נפרדות - Development, Testing ו-Production, דבר שלא היה קיים בעבר".

http://www.microsoft.com/israel/casestudies/cal1.mspx

יום רביעי, 21 באפריל 2010

Cumulative Update Package 9 for SQL Server 2005 Service Pack 3

שלום רב,

מייקרוסופט שיחררה עדכון ל- SP3 :


Microsoft SQL Server 2005 hotfixes are created for specific SQL Server service packs. You must apply a SQL Server 2005 Service Pack 3 hotfix to an installation of SQL Server 2005 Service Pack 3. By default, any hotfix that is provided in a SQL Server service pack is included in the next SQL Server service pack.

Cumulative Update 9 for SQL Server 2005 Service Pack 3 contains hotfixes for SQL Server 2005 Service Pack 3 issues that have been fixed since the release of SQL Server 2005 Service Pack 3.

http://support.microsoft.com/kb/980176/en-us


יום רביעי, 17 במרץ 2010

דרכים שונות לחיפוש באובייקטים ב- SQL Server

שלום רב,

ישנם מקרים רבים בהם אנו מנהלי בסיס הנתונים או המפתחים מעוניינים לחפש בכל קטעי הקוד בבסיס הנתונים מי לדוגמא קורא לטבלה מסויימת?
להלן קישור מאתר msSQLTips אשר מפרט את הדרכים השונות לחיפוש בתוך האובייקטים השונים בבסיס הנתונים
http://www.mssqltips.com/tip.asp?tip=1962

שימו לב ל- SQL Search Add-in של חברת RedGate אשר נבדק ומומלץ בחום.

בהצלחה .

יום רביעי, 3 במרץ 2010

ניתוח Error Log

שלום רב,


כידוע ה-SQL Server Management Studio מכיל בתוכו מספר רב של דוחות ניהול וניטור.
הדוחות הינם ברמת השרת, בסיס הנתונים ועוד , וניתן להציג בעזרתם דוחות לדוגמא:



1. פילוח CPU ו- IO ברמת בסיסי הנתונים השונים
2. שינויים אחרונים בסכמת בסיסי הנתונים
3. פילוח צריכת משאבים פר אובייקט ברמת בסיס הנתונים
4. סטטוס log shipping ועוד'...


אחת הבעיות שאני נתקל בהם בשרתי Sql server עמוסים , הינו היכולת לחקור את ה- error log,
הסיבה הינה שמדובר בדרך כלל בקבצים וב- Log ארוכים מאוד ועל-כן, בעייתי לקרוא אותם, לזהות את הבעיות ולנתח את ה- Log בצורה אופטימלית.

דוח שימושי מאוד (שלא תמיד שמים לב אליו) אשר פותר את הבעיה הנ"ל הינו "Number ot Errors" .

ניתן לפתוח אותו כך:



הדוח מציג פילוח error על פני הימים האחרונים בגרף, כולל יכולת חקירת והצגת ה- error הספצייפים.

כמו-כן, הדוח מבצע הפרדה בין Severe Errors ו- Moderate Errors

בהצלחה!

יום רביעי, 6 בינואר 2010

Trigger with insert select

שלום רב,

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

במבט ראשון, הפתרון הינו פשוט :

נקים טריגר על הטבלה , שאחרי כל Insert לטבלת הלקוחות , הטריגר יקבל את מספר הלקוח מטבלת המערכת - inserted שבטריגר ויעביר אותה לפרוצדורה.

בדרך כלל הטריגר יראה כך:

CREATE TRIGGER [dbo].[tri_TRIGGER_test_insert]
ON [dbo].[t_test_trigger]
AFTER INSERT
AS
declare @id int
select @id = id from inserted
exec p_send_mail @id
GO

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

ראשית ניצור טבלה:
CREATE table t_test_trigger
( id int)
go

להלן טריגר אשר אחרי כל הכנסת רשומה ידפיס את המספר הלקוח שהוכנס:
alter TRIGGER [dbo].[tri_TRIGGER_test_insert]
ON [dbo].[t_test_trigger]
AFTER INSERT
AS
declare @id int
select @id = id from inserted
select @id
GO

במידה ונבצע הכנסת נתונים בדרך הבאה, הכל יעבוד כשורה והטריגר יקפוץ 3 פעמים:
insert into t_test_trigger values (1)
insert into t_test_trigger values (2)
insert into t_test_trigger values (3)

אך שימו לב שאם נבצע הכנסת נתונים בו זמנית, הטריגר יקפוץ פעם אחד בלבד:
insert into t_test_trigger
select *
from t_test_trigger

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

פתרון:
במקרים בהם אנו יודעים שאופי הכנסת הנתונים מול הטבלה הינה גם על ידי
insert and select
הפתרון הינו לשים לולאה בתוך הטריגר אשר תרוץ על נתוני טבלת ה- inserted וכך הפרוצדורה שלנו תרוץ על כל הרשומות.

לדוגמא:
alter TRIGGER [dbo].[tri_TRIGGER_test_insert]
ON [dbo].[t_test_trigger]
AFTER INSERT
AS

DECLARE @id int
DECLARE uniques_cursor CURSOR FOR

select id from inserted

OPEN uniques_cursor
FETCH NEXT
FROM uniques_cursor
INTO @id
WHILE @@FETCH_STATUS = 0
BEGIN

select @id

FETCH NEXT
FROM uniques_cursor
INTO @id
END
CLOSE uniques_cursor
DEALLOCATE uniques_cursor

GO


מוסר השכל - לפני כתיבת הקוד ויישום פתרון בבסיס הנתונים ובכלל חשוב לבצע מיפוי ואפיון לעומק על מנת להבין ולמצוא גם את מקרי הקצה - וזאת על מנת למנוע באגים !

בהצלחה.

יום רביעי, 30 בדצמבר 2009

Service Pack Support

שלום,

לפי מדיניות התמיכה של מיקרוסופט service pack נתמך למשך שנה או שנתיים (מ"ה ו dynamics שנתיים, היתר שנה) לאחר יציאת ה service pack הבא.
לדוגמא אם SP2 של מוצר יצא ב יולי 2009 אזי SP1 יתמך עד יולי 2010.
פרטים מלאים על מדיניות התמיכה ב service pack ניתן למצוא ב:
http://support.microsoft.com/lifecycle/#ServicePackSupport

ברצוני להתריע בפניכם כי SQL server 2005 SP2 עומד לצאת מתמיכה ב 10 לינואר 2010.
לכן, במידה ועדיין קיימות אצלכם מערכות בארגון עם SP2 מהרו לבצע בדיקות ולאחר מכן פריסת SQL Server 2005 SP3.

לפרטים נוספים:
http://blogs.msdn.com/sqlreleaseservices/archive/2009/10/08/end-of-service-pack-support-for-sql-server-2005-sp2-and-sql-server-2008-rtm.aspx

בהצלחה.

יום שני, 21 בדצמבר 2009

Cumulative update package 7 for SQL Server 2005 Service Pack 3


Microsoft SQL Server 2005 hotfixes are created for specific SQL Server service packs. You must apply a SQL Server 2005 Service Pack 3 (SP3) hotfix to an installation of SQL Server 2005 SP3. By default, any hotfix that is provided in a SQL Server service pack is included in the next SQL Server service pack.

Cumulative Update 7 for SQL Server 2005 SP3 contains hotfixes for SQL Server 2005 SP3 issues that have been fixed since the release of SQL Server 2005 SP3.


http://support.microsoft.com/kb/976951

יום שלישי, 15 בדצמבר 2009

EXCEPT and INTERSECT

שלום רב,

ישנם פעמים בהם ישנו לנו 2 מקורות מידע (שאילתות, טבלאות וכו'...) אשר אנו רוצים לדעת אילו רשומות קיימות במקור הראשון ולא נימצאות במקור השני.
או לחילופי- אנו רוצים לדעת אילו רשומות קיימות בשני המקורות.

לשם כך קיימות הפקודות INTERSECT ו- EXCEPT .

EXCEPT - מציגה את הרשומות אשר נימצאות במקור הראשון ולא נימצאות במקור השני.
INTERSECT - מציגה את הרשומות אשר נימצאות בשני המקורות.

לדוגמא:

USE AdventureWorks;
GO
SELECT ProductID
FROM Production.Product
INTERSECT
SELECT ProductID
FROM Production.WorkOrder ;
--Result: 238 Rows (products that have work orders)

או

USE AdventureWorks;
GO
SELECT ProductID
FROM Production.Product
EXCEPT
SELECT ProductID
FROM Production.WorkOrder ;
--Result: 266 Rows (products without work orders)

שימושי ויעיל מאוד!

בהצלחה!

יום רביעי, 9 בדצמבר 2009

Search for a String in all Stored Procedures in all the databases

שלום רב,
להלן פרוצדורה שימושית אשר מקבלת סטרינג ומחפש את הערך הנ"ל בכל הפרוצדורות בכל בסיסי הנתונים .
CREATE PROCEDURE Find_Text_In_SP_InAllTables
@mysting nvarchar(250)
as

DECLARE @sqlCommand nvarchar(max)
CREATE TABLE #TABLE (DATABASENAME nvarchar(250) , PROCEDURE_NAME nvarchar(max))
DECLARE @unique_num nvarchar(250)
set @mysting = '''%' + @mysting + '%'''
DECLARE uniques_cursor CURSOR FOR

select name
from sys.databases

OPEN uniques_cursor
FETCH NEXT
FROM uniques_cursor
INTO @unique_num
WHILE @@FETCH_STATUS = 0
BEGIN

SET @sqlCommand = 'INSERT INTO #TABLE select ''' +@unique_num + ''' ,definition from '+@unique_num +'.sys.sql_modules where definition like '+@mysting
EXECUTE sp_executesql @sqlCommand

FETCH NEXT
FROM uniques_cursor
INTO @unique_num
END
CLOSE uniques_cursor
DEALLOCATE uniques_cursor
select * from #TABLE
drop TABLE #TABLE
GO

על מנת להריץ את הפרוצדורה:
exec Find_Text_In_SP_InAllTables 'Batch'

יום רביעי, 2 בדצמבר 2009

העלאת גרסת בסיס נתונים

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


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

לאחר מכן, את סכמת הטבלאות , וקטעי הקוד בבסיס הנתונים תוכל להעלות על ידי
סקירפט - (קליק ימני על בסיס הנתונים המבוקש).
כמו-כן, בגרסת SQL Server Management Studio של ה- 2008 אתה יכול לכלול בסקריפט
גם data (ולא רק סכמה).

כמובן, שבמידה ואתה רוצה לדרוס את הסביבה הקיימת בסביבה החדשה תמיד תוכל לעשות
גיבוי ושחזור.

בהצלחה.