Saya harus menulis skrip penerapan yang akan berfungsi jika ada prosedur tersimpan atau tidak ada. yaitu jika ada, maka saya perlu mengubahnya, jika tidak buatlah.
Bagaimana saya bisa melakukan ini di sql.
Saya menggunakan SQL Server 2005
Saya harus menulis skrip penerapan yang akan berfungsi jika ada prosedur tersimpan atau tidak ada. yaitu jika ada, maka saya perlu mengubahnya, jika tidak buatlah.
Bagaimana saya bisa melakukan ini di sql.
Saya menggunakan SQL Server 2005
Jawaban:
Jika Anda MENGHENTIKAN dan MENCIPTAKAN prosedur, Anda akan kehilangan pengaturan keamanan. Ini bisa mengganggu DBA Anda atau menghancurkan aplikasi Anda sama sekali.
Apa yang saya lakukan adalah membuat prosedur tersimpan sepele jika belum ada. Setelah itu, Anda dapat mengubah prosedur tersimpan sesuai dengan keinginan Anda.
IF object_id('YourSp') IS NULL
EXEC ('create procedure dbo.YourSp as select 1')
GO
ALTER PROCEDURE dbo.YourSp
AS
...
Dengan cara ini, pengaturan keamanan, komentar dan meta deta lainnya akan selamat dari penyebaran.
if object_id('YourSp') is null BEGIN ... END
untuk menambahkan izin yang tepat setelah membuat prosedur tersimpan.
Cara terbersih adalah dengan menguji keberadaannya, jatuhkan jika ada, lalu buat ulang. Anda tidak dapat menanamkan pernyataan "buat proc" di dalam pernyataan IF. Ini harus dilakukan dengan baik:
IF OBJECT_ID('MySproc', 'P') IS NOT NULL
DROP PROC MySproc
GO
CREATE PROC MySproc
AS
BEGIN
...
END
Jika Anda hanya berurusan dengan prosedur tersimpan, hal yang paling mudah untuk dilakukan adalah mungkin menjatuhkan proc, lalu membuatnya kembali. Anda bisa menghasilkan semua kode untuk melakukan ini menggunakan panduan Menghasilkan Script di 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...
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
dimana xxx
nama proc
Selain apa yang telah dikatakan, saya juga ingin menambahkan pendekatan yang berbeda dan menganjurkan penggunaan strategi penyebaran skrip diferensial. Alih-alih membuat skrip stateful yang selalu memeriksa keadaan saat ini dan bertindak berdasarkan kondisi itu, gunakan melalui serangkaian skrip stateless yang meningkatkan versi dari versi terkenal . Saya telah menggunakan strategi ini dan itu menghasilkan banyak waktu karena skrip penerapan saya sekarang semuanya 'JIKA' gratis.
Anda dapat menulis kueri sebagai berikut:
IF OBJECT_ID('ProcedureName','P') IS NOT NULL
DROP PROC ProcedureName
GO
CREATE PROCEDURE [dbo].[ProcedureName]
...your query here....
Untuk lebih spesifik pada sintaks di atas:
OBJECT_ID adalah nomor id unik untuk objek dalam database, ini digunakan secara internal oleh SQL Server. Karena kita melewati ProcedureName diikuti oleh Anda objek tipe P yang memberitahu SQL Server bahwa Anda harus menemukan objek yang disebut ProcedureName yang merupakan tipe prosedur yaitu, P
Kueri ini akan menemukan prosedur dan jika tersedia itu akan menjatuhkannya dan membuat yang baru.
Untuk informasi terperinci tentang OBJECT_ID dan jenis Objek, silakan kunjungi: SYS.Objects
IF OBJECT_ID('SPNAME') IS NULL
-- Does Not Exists
ELSE
-- Exists
Saya memiliki proc tersimpan yang memungkinkan pelanggan untuk memperpanjang validasi, jika ada, saya tidak ingin mengubahnya, jika tidak saya ingin membuatnya, cara terbaik yang saya temukan:
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
Kode di bawah ini akan memeriksa apakah prosedur yang tersimpan sudah ada atau belum.
Jika ada itu akan berubah, jika tidak ada itu akan membuat prosedur tersimpan baru untuk Anda:
//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