content top
משפט חדש CREATE OR ALTER ב-SQL Server SP1

משפט חדש CREATE OR ALTER ב-SQL Server SP1

1. הקדמה:

כאשר אנו כותבים אובייקטים ב-sql אנו משתמשים במשפטי create לכתיבת אובייקט חדש או alter לשינוי אובייקט קיים.

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

1.1. נגדיר טבלת מטבעות בצורה הבאה:

USE [TEST_DB]

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE TABLE [dbo].[Currency](

[CurrencyCode] [nchar](3) COLLATE Latin1_General_CS_AS NOT NULL,

[Name] [dbo].[Name] NOT NULL,

[ModifiedDate] [datetime] NOT NULL CONSTRAINT [DF_Currency_ModifiedDate]

DEFAULT (getdate()),

CONSTRAINT [PK_Currency_CurrencyCode] PRIMARY KEY CLUSTERED

(

[CurrencyCode] ASC

)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY]

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

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

-- =============================================

-- Description: קבלת רשימת מטבעות

-- =============================================

create PROCEDURE getCurrencies

@modifiedDate datetime

As

begin

-- SET NOCOUNT ON added to prevent extra result sets from

-- interfering with SELECT statements.

SET NOCOUNT ON;

select CurrencyCode,

[Name]

from Currency

where @modifiedDate is null

or datediff(day, ModifiedDate,@modifiedDate) = 0

if(@@error != 0 )

begin

raiserror('A failure occured in retrieving currencies data', 11, 1)

return 1

end

return 0

end

GO

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

exec getCurrencies null

1.4. הפרוצדורה קיימת כבר. אם ננסה ליצור שוב את הפרוצדורה, נקבל הודעה:

1.5. לכן נשתמש בפקודה … alter PROCEDURE getCurrencies

1.6. או נכתוב לפני פקודת ה-create שורה הבודקת אם הפרוצדורה קיימת ואם כן, מבצעת את הפקודה drop proc

if exists(select 1 from sysobjects where name='getCurrencies' and xtype ='P')

drop proc getCurrencies

2. הבעיה:

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

הבעיה מתחילה, כאשר אנו כותבים סקריפט להתקנת אובייקטים באתר הלקוח. אנו צריכים לקחת בחשבון שייתכן וישנם אובייקטים שכבר קיימים ואז אנו צריכים לבצע משפטי create/alter בהתאם. אם אנו מחליטים לבצע לפני משפט ה-create בדיקה אם קיים האובייקט ואם כן לבצע עליו drop, אנו צריכים לפני כל יצירת אובייקט לכתוב משפטי sql שבודקים את קיומו לפי שם ולפי סוג. זאת הרבה עבודה ופתח לטעויות בפרט אם מספר האובייקטים שיש ליצור גדול.

3. הפתרון:

ב- SQL Server 2016 SP1הכניסו משפט חדש create or alter בנוסף לרק create. זה משחרר את המפתחים לכתוב אקסטרה קוד הבודק אם האובייקט קיים ב-sysobjects ואם כן לבצע לו drop ו-recreate. המשפט החדש עושה זאת עבורם. הוא פועל כמו create/alter רגילים.

4. הערות:

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


2 תגובות על “משפט חדש CREATE OR ALTER ב-SQL Server SP1”

  1. מאת תמר:

    מה ההבדל בין CREATE OR ALTER
    לבין CREATE OR REPLACE?

  2. זה אותו דבר. CREATE OR ALTER זה הסינטקס ב-SQL Server, ו-CREATE OR REPLACE זה הסינטקס ב-Oracle.

כתיבת תגובה

האימייל לא יוצג באתר. (*) שדות חובה מסומנים

six + fourteen =