ฉันต้องเขียนสคริปต์การปรับใช้ซึ่งจะทำงานได้หากมีโพรซีเดอร์ที่เก็บอยู่หรือไม่มีอยู่ กล่าวคือถ้ามีอยู่ฉันจำเป็นต้องแก้ไขมิฉะนั้นจะสร้างมันขึ้นมา
ฉันจะทำสิ่งนี้ใน sql ได้อย่างไร
ฉันใช้ SQL Server 2005
ฉันต้องเขียนสคริปต์การปรับใช้ซึ่งจะทำงานได้หากมีโพรซีเดอร์ที่เก็บอยู่หรือไม่มีอยู่ กล่าวคือถ้ามีอยู่ฉันจำเป็นต้องแก้ไขมิฉะนั้นจะสร้างมันขึ้นมา
ฉันจะทำสิ่งนี้ใน sql ได้อย่างไร
ฉันใช้ SQL Server 2005
คำตอบ:
หากคุณวางและสร้างขั้นตอนคุณจะสูญเสียการตั้งค่าความปลอดภัย สิ่งนี้อาจรบกวน DBA ของคุณหรือทำให้แอปพลิเคชันของคุณเสียหายโดยสิ้นเชิง
สิ่งที่ฉันทำคือสร้างกระบวนงานที่เก็บไว้เล็กน้อยหากยังไม่มี หลังจากนั้นคุณสามารถแก้ไขขั้นตอนการจัดเก็บตามที่คุณต้องการ
IF object_id('YourSp') IS NULL
EXEC ('create procedure dbo.YourSp as select 1')
GO
ALTER PROCEDURE dbo.YourSp
AS
...
วิธีนี้การตั้งค่าความปลอดภัยความคิดเห็นและเมตาดาต้าอื่น ๆ จะอยู่รอดจากการปรับใช้
if object_id('YourSp') is null BEGIN ... END
เพิ่มสิทธิ์ที่เหมาะสมหลังจากสร้างขั้นตอนการจัดเก็บ
วิธีที่สะอาดที่สุดคือทดสอบการมีอยู่ปล่อยวางถ้ามีอยู่แล้วสร้างใหม่ คุณไม่สามารถฝังคำสั่ง "create proc" ไว้ในคำสั่ง IF สิ่งนี้ควรทำอย่างยิ่ง:
IF OBJECT_ID('MySproc', 'P') IS NOT NULL
DROP PROC MySproc
GO
CREATE PROC MySproc
AS
BEGIN
...
END
หากคุณกำลังจัดการกับโพรซีเดอร์ที่จัดเก็บไว้เท่านั้นสิ่งที่ง่ายที่สุดที่ควรทำคืออาจจะวาง proc แล้วสร้างใหม่ คุณสามารถสร้างโค้ดทั้งหมดเพื่อทำสิ่งนี้โดยใช้วิซาร์ดสร้างสคริปต์ใน SQL Server
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[YourSproc]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[YourSproc]
CREATE PROCEDURE YourSproc...
จากSQL Server 2016 CTP3
คุณสามารถใช้ คำสั่งDIEใหม่แทนการIF
ห่อใหญ่
ไวยากรณ์:
วาง {PROC | ขั้นตอน} [IF EXISTS] {[schema_name. ] ขั้นตอน} [, ... n]
ค้นหา:
DROP PROCEDURE IF EXISTS usp_name
ข้อมูลเพิ่มเติมที่นี่
if not exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[xxx]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
BEGIN
CREATE PROCEDURE dbo.xxx
xxx
ชื่อ proc อยู่ที่ไหน
นอกเหนือจากสิ่งที่ได้กล่าวไปแล้วฉันยังต้องการเพิ่มแนวทางที่แตกต่างและสนับสนุนการใช้กลยุทธ์การปรับใช้สคริปต์ที่แตกต่างกัน แทนการทำสคริปต์ stateful ที่ตรวจสอบเสมอสถานะปัจจุบันและการกระทำบนพื้นฐานของรัฐที่ปรับใช้ผ่านชุดของสคริปต์ไร้สัญชาติที่อัพเกรดจากรุ่นที่รู้จักกันดี ฉันได้ใช้กลยุทธ์นี้และได้ผลดีเนื่องจากสคริปต์การปรับใช้ของฉันตอนนี้ "IF" ทั้งหมดฟรี
คุณสามารถเขียนแบบสอบถามได้ดังนี้:
IF OBJECT_ID('ProcedureName','P') IS NOT NULL
DROP PROC ProcedureName
GO
CREATE PROCEDURE [dbo].[ProcedureName]
...your query here....
เพื่อให้มีความเฉพาะเจาะจงมากขึ้นในไวยากรณ์ด้านบน:
OBJECT_IDเป็นหมายเลข ID เฉพาะสำหรับอ็อบเจ็กต์ภายในฐานข้อมูลซึ่ง SQL Server จะใช้ภายใน เนื่องจากเรากำลังส่งProcedureNameตามด้วยคุณ object type Pซึ่งบอก SQL Server ว่าคุณควรหาวัตถุที่เรียกว่าProcedureNameซึ่งเป็นโพรซีเดอร์ประเภทคือ P
แบบสอบถามนี้จะค้นหาโพรซีเดอร์และหากมีก็จะทิ้งและสร้างใหม่
สำหรับข้อมูลโดยละเอียดเกี่ยวกับ OBJECT_ID และประเภท Object โปรดไปที่: SYS.Objects
IF OBJECT_ID('SPNAME') IS NULL
-- Does Not Exists
ELSE
-- Exists
ฉันมี proc ที่จัดเก็บไว้ซึ่งช่วยให้ลูกค้าสามารถขยายการตรวจสอบความถูกต้องได้หากมีอยู่ฉันไม่ต้องการเปลี่ยนแปลงหากไม่ต้องการสร้างวิธีที่ดีที่สุดที่ฉันพบ:
IF OBJECT_ID('ValidateRequestPost') IS NULL
BEGIN
EXEC ('CREATE PROCEDURE ValidateRequestPost
@RequestNo VARCHAR(30),
@ErrorStates VARCHAR(255) OUTPUT
AS
BEGIN
SELECT @ErrorStates = @ErrorStates
END')
END
รหัสด้านล่างจะตรวจสอบว่ามีขั้นตอนการจัดเก็บอยู่แล้วหรือไม่
หากมีอยู่จะมีการเปลี่ยนแปลงหากไม่มีอยู่ระบบจะสร้างกระบวนงานที่จัดเก็บใหม่ให้คุณ:
//syntax for Create and Alter Proc
DECLARE @Create NVARCHAR(200) = 'Create PROCEDURE sp_cp_test';
DECLARE @Alter NVARCHAR(200) ='Alter PROCEDURE sp_cp_test';
//Actual Procedure
DECLARE @Proc NVARCHAR(200)= ' AS BEGIN select ''sh'' END';
//Checking For Sp
IF EXISTS (SELECT *
FROM sysobjects
WHERE id = Object_id('[dbo].[sp_cp_test]')
AND Objectproperty(id, 'IsProcedure') = 1
AND xtype = 'p'
AND NAME = 'sp_cp_test')
BEGIN
SET @Proc=@Alter + @Proc
EXEC (@proc)
END
ELSE
BEGIN
SET @Proc=@Create + @Proc
EXEC (@proc)
END
go
ตัวเลือกที่ดีกว่าอาจใช้เครื่องมือเช่น Red-Gate SQL Compare หรือ SQL Examiner เพื่อเปรียบเทียบความแตกต่างโดยอัตโนมัติและสร้างสคริปต์การย้ายข้อมูล