האח הגדול עינו פקוחה (2) – מי התחבר לשרת?

22/01/2010

אנחנו ממשיכים במלאכת המעקב החשאית- לא רק מי שינה דברים (הפוסט הקודם), אלא גם- מי התחבר.. קודם כל ניצור טבלת מעקב ב-master: USE master GO CREATE TABLE T_Maakav(Taarih datetime, varchar(128), varchar(128), varchar(128), char(10), varchar(128), smallint) GO וכעת ניצור טריגר DDL מתאים: Create TRIGGER Prevent_Apps_logon ON ALL SERVER FOR LogOn AS BEGIN Insert Into T_Maakav Select GetDate() Taarih, User_Name() ,System_User , App_Name(), Host_ID( ) , Host_Name( ) , @@SPID Where OBJECT_ID('master.dbo.T_Maakav') Is Not Null And App_Name()<>'Report Server' END תנאי ה-Where הראשון הוא קריטי: בלעדיו אנחנו עלולים להיתקע מחוץ לשרת מבלי יכולת להיכנס, אם מישהו בטעות ימחק את טבלת המעקב! התנאי השני נועד להדגים כיצד לסנן הודעות מיותרות: הטבלה תתמלא מהר מאוד על ידי תהליכים שרצים ברקע ומתחברים...
אין תגובות

האח הגדול עינו פקוחה – תיעוד כל השינויים בדטבייס

21/01/2010

הגיע הזמן לגלות מי עשה מה ומתי, ועם החומר המרשיע לזמן את החשודים לחדר החקירות! ניצור טבלת מעקב: Create Table DDLEventLog(Taarih DateTime Null, UserName SysName Null, ObjectName SysName Null, CommandText VarChar(Max) Null, EventType VarChar(Max) Null, DatabaseName VarChar(Max) Null, SchemaName VarChar(Max) Null, SpID VarChar(Max) Null, LoginName VarChar(Max) Null); ניצור טריגר DDL שיתעד לטבלה כל פיפס: Create Trigger TrgEventLog On Database For DDL_Database_Level_Events As Insert Into DDLEventLog(Taarih, UserName, ObjectName, CommandText, EventType, DatabaseName, SchemaName, SpID, LoginName) Select EventData().value('(/EVENT_INSTANCE/PostTime)', 'DateTime') Taarih, EventData().value('(/EVENT_INSTANCE/UserName)','VarChar(Max)') UserName, EventData().value('(/EVENT_INSTANCE/ObjectName)','VarChar(Max)') ObjectName, EventData().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)','VarChar(Max)') CommandText, EventData().value('(/EVENT_INSTANCE/EventType)','VarChar(Max)') EventType, EventData().value('(/EVENT_INSTANCE/DatabaseName)','VarChar(Max)') DatabaseName, EventData().value('data(/EVENT_INSTANCE/SchemaName)','VarChar(Max)') SchemaName, EventData().value('(/EVENT_INSTANCE/SPID)', 'VarChar(Max)') SpID, EventData().value('(/EVENT_INSTANCE/LoginName)','VarChar(Max)') LoginName; וכעת לבדיקה ננסה ליצור טבלה, לבטל אותה, ולראות מה מופיע בטבלת המעקב: Create Table MyTest(I Int); Go Drop Table MyTest; Go Select * From DDLEventLog;
אין תגובות

מחולל מספרים ראשוניים

13/01/2010

לא הכי שימושי, אבל אתגר נצחי לחובבי הז'אנר: Declare @N Int=1000; With T As (Select 1 Mispar Union All Select Mispar+1 From T Where Mispar<@N) Select T1.Mispar*T2.Mispar Mispar From T T1, T T2 Group By T1.Mispar*T2.Mispar Having Count(*)=2 And T1.Mispar*T2.Mispar<=@N Order By 1 option (MaxRecursion 0); במקרה זה מוכפלים המספרים 1..1000 אלו באלו, ונשלפות המכפלות שמופיעות רק פעמיים: אלו הם המספרים הראשונים שנוצרים רק ממכפלה ב-1. ודרך שונה: Declare @N Int=1000; With T As (Select 2 Mispar Union All Select Mispar+1 From T Where Mispar<@N) Select Mispar From T T1 Where Not Exists (Select * From T T2 Where T2.Mispar<=Sqrt(T1.Mispar) And T1.Mispar%T2.Mispar=0) Order By 1 option (MaxRecursion 0); במקרה זה מחפשים את כל המספרים מ-2 ואילך שאין מספר אחר שהם מתחלקים בו ללא שארית (נבדקים כל המספרים מ-2 ועד שורש המספר - מטעמי יעילות). ולבסוף- הדרך הכי...
אין תגובות

יחס של רבים לרבים ללא טבלת עזר

06/01/2010

בדרך כלל יחס של רבים לרבים בין שתי טבלאות ממומש באמצעות טבלת עזר שמקשרת בין שתי הטבלאות, והמפתח הראשי שלה הוא צירוף המפתחות הראשיים של שתיהן. ניתן במקרה הצורך ליצור יחס של רבים לרבים ללא טבלת עזר. אינני יודע מתי זה טוב, אבל זה אפשרי ולהלן שתי דרכים. נניח שבעירנו יש מספר מוסדות תרבות, כל אחד פתוח בימים אחרים במהלך השבוע, ואנחנו מעוניינים להחזיק את המידע הזה. נקים קודם כל את טבלת ימי השבוע: Create Table #T_Yamim(Yom Int,Shem VarChar(Max)) Insert Into #T_Yamim Select 1,'א' Insert Into #T_Yamim Select 2,'ב' Insert Into #T_Yamim Select 3,'ג' Insert Into #T_Yamim Select 4,'ד' Insert Into #T_Yamim Select 5,'ה' Insert Into #T_Yamim Select 6,'ו' Insert Into #T_Yamim...
אין תגובות

כיצד להריץ שאילתת SQL לשליפת נתונים מה-OLAP

01/01/2010

לפני מספר שנים עבדתי על מערכת דוחות ב-Reporting Services שהתבססה על קוביות OLAP. אחד הדוחות היה מאוד מורכב ולא ניתן היה לבצע אותו בעזרת MDX (כלומר- שליפה מקוביית ה-OLAP), ונאלצנו בלתי ברירה להתבסס על טבלת ה-Fact  שב-SQL Server (טבלת המקור של הקוביה). זה יצר בעייה חדשה: ב-OLAP מומשה מערכת הרשאות שאיפשרה למנהל של כל אזור לראות רק את הנתונים של האזור שלו, אבל כל זה לא היה קיים בטבלת ה-Fact, והדוח שיצרנו היה מאפשר לכל אחד לעיין בכל הנתונים.. מה עושים? לבנות מערכת הרשאות מקבילה ב-SQL Server זה בלתי אפשרי- תקציב הפיתוח כבר נוצל, היינו אמורים לסיים בהקדם את הדוחות, ולהקמת מערכת...