[SQL] 저장 프로 시저를 작성하기 전에 존재하는지 확인하는 방법
SQL저장 프로 시저를 작성하기 전에 존재하는지 확인하는 방법
나는 클라이언트가 "데이터베이스 관리"기능을 실행 할 때마다 실행해야하는 SQL 스크립트가 있습니다. 스크립트는 클라이언트 데이터베이스에 저장 프로 시저를 생성하는 단계를 포함한다. 이러한 클라이언트 중 일부는 이미 스크립트를 실행시 저장 프로 시저가있을 수 있습니다, 일부는하지 않을 수 있습니다. 나는 클라이언트 데이터베이스에 추가 누락 된 저장 프로 시저가 필요하지만, 내가 얻을, T-SQL 구문을 구부리려고 얼마나 중요하지 않습니다
나는 작품을 만들기 전에 삭제 읽었습니다,하지만 난 그런 식으로 일을 좋아하지 않는다.
IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'MyProc')
DROP PROCEDURE MyProc
GO
CREATE PROCEDURE MyProc
...
존재를 않는 경우 어떻게 그것을 저장 프로 시저의 존재에 대한 검사를 추가하고 생성을 존재하지 않는 경우 만 변경할 수 있습니다?
해결법
-
==============================
1.당신은 당신이 쿼리를 실행 할 수있는 절차 적 코드 어디를 실행할 수 있습니다.
당신은 당신이 쿼리를 실행 할 수있는 절차 적 코드 어디를 실행할 수 있습니다.
그냥 AS 후 모든 것을 복사 :
BEGIN DECLARE @myvar INT SELECT * FROM mytable WHERE @myvar ... END
이 코드는 저장된 프로 시저가 수행하는 것과 같은 일을하지만, 데이터베이스 측에 저장되지 않습니다.
그 많은 PL / SQL에서 익명의 절차라는 것을 같아요.
최신 정보:
귀하의 질문 제목은 조금 혼란이다.
그렇지 존재하는 경우에만 프로 시저를 작성해야하는 경우, 다음 코드는 잘입니다.
여기에 생성 스크립트에 어떤 SSMS 출력입니다 :
IF EXISTS ( SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'myproc') AND type IN ( N'P', N'PC' ) ) DROP … CREATE …
최신 정보:
스키마를 포함 할 때 방법의 예는 그것을 할 수 있습니다 :
IF EXISTS ( SELECT * FROM sysobjects WHERE id = object_id(N'[dbo].[MyProc]') and OBJECTPROPERTY(id, N'IsProcedure') = 1 ) BEGIN DROP PROCEDURE [dbo].[MyProc] END
위의 예에서, DBO 스키마입니다.
최신 정보:
SQL 서버 2016+에서, 당신은 할 수 있습니다
또는 ALTER PROCEDURE dbo.myProc 소유자를 CREATE
-
==============================
2.나는 대답으로이 이미 표시되었습니다 실현,하지만 우리는 이런 식으로 작업을 수행하는 데 사용 :
나는 대답으로이 이미 표시되었습니다 실현,하지만 우리는 이런 식으로 작업을 수행하는 데 사용 :
IF NOT EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND OBJECT_ID = OBJECT_ID('dbo.MyProc')) exec('CREATE PROCEDURE [dbo].[MyProc] AS BEGIN SET NOCOUNT ON; END') GO ALTER PROCEDURE [dbo].[MyProc] AS ....
그냥 절차를 떨어 뜨리지 않도록합니다.
-
==============================
3.당신이 그것을 제거하기 전에 데이터베이스 개체의 존재를 확인하는 가장 간단한 방법을 찾고 있다면, 여기에 (예를 들어 그냥 위의 예처럼 SPROC를 사용하지만 테이블, 인덱스, 수정할 수 수 등 ...) 하나의 방법입니다 :
당신이 그것을 제거하기 전에 데이터베이스 개체의 존재를 확인하는 가장 간단한 방법을 찾고 있다면, 여기에 (예를 들어 그냥 위의 예처럼 SPROC를 사용하지만 테이블, 인덱스, 수정할 수 수 등 ...) 하나의 방법입니다 :
IF (OBJECT_ID('MyProcedure') IS NOT NULL) DROP PROCEDURE MyProcedure GO
이 신속하고 우아하지만이 점을 고려해야합니다 않기 때문에 당신은 당신이 모든 객체 유형에 대해 고유 개체 이름을 확인해야합니다.
이게 도움이 되길 바란다!
-
==============================
4.난 당신이 원하는 알고있다 "존재하는 경우 절차를 변경하고 존재하지 않는 경우에만 삭제"하지만 난 그냥 항상을 다시 만들기 다음 절차를 드롭하는 것이 더 간단하다고 믿습니다. 여기에 이미 존재하는 경우에만 절차를 삭제하는 방법은 다음과 같습니다
난 당신이 원하는 알고있다 "존재하는 경우 절차를 변경하고 존재하지 않는 경우에만 삭제"하지만 난 그냥 항상을 다시 만들기 다음 절차를 드롭하는 것이 더 간단하다고 믿습니다. 여기에 이미 존재하는 경우에만 절차를 삭제하는 방법은 다음과 같습니다
IF OBJECT_ID('MyProcedure', 'P') IS NOT NULL DROP PROCEDURE MyProcedure GO
두 번째 매개 변수는 저장 프로 시저를하는 OBJECT_TYPE = 'P'와 객체 만보기에 OBJECT_ID를 알려줍니다 :
당신은을 통해 옵션의 전체 목록을 얻을 수 있습니다 :
SELECT name FROM master..spt_values WHERE type = 'O9T'
-
==============================
5.SQL 서버 2016로 새 DROP PROCEDURE IF가 존재 사용할 수 있습니다. DROP {PROC | PROCEDURE} {[SCHEMA_NAME [IF 존재]가. ] 프로} ... N]
SQL 서버 2016로 새 DROP PROCEDURE IF가 존재 사용할 수 있습니다. DROP {PROC | PROCEDURE} {[SCHEMA_NAME [IF 존재]가. ] 프로} ... N]
참조 : https://msdn.microsoft.com/en-us/library/ms174969.aspx
-
==============================
6.나는 그것이 아주 오래된 게시물입니다 알지만, 따라서 SQL 서버 2016 SP1을 사용하는 사람들을위한 최신 업데이트를 추가 상단 검색 결과에서이 보이므로 -
나는 그것이 아주 오래된 게시물입니다 알지만, 따라서 SQL 서버 2016 SP1을 사용하는 사람들을위한 최신 업데이트를 추가 상단 검색 결과에서이 보이므로 -
create or alter procedure procTest as begin print (1) end; go
이것은 이미 존재하지 않는 경우 저장 프로 시저를 생성, 존재하지만 그 경우 변경합니다.
참고
-
==============================
7.DROP IF가 존재 SQL 서버 2016의 새로운 기능입니다
DROP IF가 존재 SQL 서버 2016의 새로운 기능입니다
https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/
DROP PROCEDURE IF EXISTS dbo.[procname]
-
==============================
8.저도 같은 오류가 발생했습니다. 나는이 스레드가 이미 꽤 많이 죽었 알고 있지만 나는 "익명 절차"이외의 다른 옵션을 설정합니다.
저도 같은 오류가 발생했습니다. 나는이 스레드가 이미 꽤 많이 죽었 알고 있지만 나는 "익명 절차"이외의 다른 옵션을 설정합니다.
나는 이런 식으로 해결 :
-
==============================
9.여기에 방법과이 방법을 사용하여 뒤에 몇 가지 추론이다. 그것은 꽤 저장된 프로 시저 편집에 관한 것이 아니라 장점과 단점이 있습니다 ...
여기에 방법과이 방법을 사용하여 뒤에 몇 가지 추론이다. 그것은 꽤 저장된 프로 시저 편집에 관한 것이 아니라 장점과 단점이 있습니다 ...
UPDATE : 또한 트랜잭션이 전체 호출을 래핑 할 수 있습니다. 많은 저장된 모든 커밋 할 수있는 단일 트랜잭션 절차 또는 모든 롤백을 포함. 트랜잭션에서 포장의 또 다른 장점은 저장 프로 시저가 항상이 READ UNCOMMITTED 트랜잭션 격리 수준을 사용하지 않는만큼 다른 SQL 연결을 위해 존재입니다!
1) 단지 프로세스 결정으로 변경합니다을 방지하기 위해. 우리의 프로세스는 IF가 DROP 다음 CREATE EXISTS 항상한다. 새 PROC 가정의 동일한 패턴이 원하는 PROC이다 할 경우는 IF가 ALTER가 ELSE CREATE EXISTS 것 때문에 변경합니다 음식을 장만하는 것은 조금 어렵습니다.
2) 당신은 당신이 트랜잭션 외부의 동적 SQL에서 프로 시저 업데이트의 순서를 포장 할 수 있도록 일괄 처리의 첫 번째 통화로 / ALTER를 만들 넣어해야합니다. 기본적으로이 절차 업데이트의 전체 스택을 실행하거나 그들에게 DB 백업을 복원하지 않고 모든 다시 롤하려는 경우,이 하나의 일괄 처리로 모든 것을 할 수있는 방법이다.
IF NOT EXISTS (select ss.name as SchemaName, sp.name as StoredProc from sys.procedures sp join sys.schemas ss on sp.schema_id = ss.schema_id where ss.name = 'dbo' and sp.name = 'MyStoredProc') BEGIN DECLARE @sql NVARCHAR(MAX) -- Not so aesthetically pleasing part. The actual proc definition is stored -- in our variable and then executed. SELECT @sql = 'CREATE PROCEDURE [dbo].[MyStoredProc] ( @MyParam int ) AS SELECT @MyParam' EXEC sp_executesql @sql END
-
==============================
10.이후 SQL 서버 2008에서는 "INFORMATION_SCHEMA.ROUTINES"를 사용할 수 있습니다
이후 SQL 서버 2008에서는 "INFORMATION_SCHEMA.ROUTINES"를 사용할 수 있습니다
IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = 'MySP' AND ROUTINE_TYPE = 'PROCEDURE')
-
==============================
11.나는 분명히 투표 또는 주석에 필요한 평판을 가지고 있지 않지만, 난 그냥 (더 좋을 수도 sp_executesql을) EXEC를 사용 제프의 대답은 확실히 갈 수있는 방법이라고 말하고 싶었다. 다시 만들기 저장 프로 시저를 다음 삭제하고하는 것은 결국 일을 얻을 수 있지만, 저장 프로 시저가 전혀 존재하지 않는 경우 순간 시간이, 그리고이 될 것입니다 뭔가 특히 경우 즉, 아주 나쁜 될 수 있습니다 반복적으로 실행합니다. 나는 백그라운드 스레드는 IF EXISTS DROP을하고 있었기 때문에 ... 내 응용 프로그램과 모든 종류의 문제를 가진 다른 스레드가 저장 프로 시저를 사용하려고했다 동시에 CREATE했다.
나는 분명히 투표 또는 주석에 필요한 평판을 가지고 있지 않지만, 난 그냥 (더 좋을 수도 sp_executesql을) EXEC를 사용 제프의 대답은 확실히 갈 수있는 방법이라고 말하고 싶었다. 다시 만들기 저장 프로 시저를 다음 삭제하고하는 것은 결국 일을 얻을 수 있지만, 저장 프로 시저가 전혀 존재하지 않는 경우 순간 시간이, 그리고이 될 것입니다 뭔가 특히 경우 즉, 아주 나쁜 될 수 있습니다 반복적으로 실행합니다. 나는 백그라운드 스레드는 IF EXISTS DROP을하고 있었기 때문에 ... 내 응용 프로그램과 모든 종류의 문제를 가진 다른 스레드가 저장 프로 시저를 사용하려고했다 동시에 CREATE했다.
-
==============================
12.** T-SQL에 저장된 프로 시저를 삭제하고 다시 작성하는 가장 간단한 방법은 **입니다
** T-SQL에 저장된 프로 시저를 삭제하고 다시 작성하는 가장 간단한 방법은 **입니다
Use DatabaseName go If Object_Id('schema.storedprocname') is not null begin drop procedure schema.storedprocname end go create procedure schema.storedprocname as begin end
-
==============================
13.여기 내가 사용하는 스크립트입니다. 그것으로, 나는 불필요하게 삭제하고 저장 발동를 다시 마십시오.
여기 내가 사용하는 스크립트입니다. 그것으로, 나는 불필요하게 삭제하고 저장 발동를 다시 마십시오.
IF NOT EXISTS ( SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[uspMyProcedure]') ) BEGIN EXEC sp_executesql N'CREATE PROCEDURE [dbo].[uspMyProcedure] AS select 1' END GO ALTER PROCEDURE [dbo].[uspMyProcedure] @variable1 INTEGER AS BEGIN -- Stored procedure logic END
-
==============================
14.저장 프로 시저를 들어 IF의 존재를 확인
저장 프로 시저를 들어 IF의 존재를 확인
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID (N'[Schema].[Procedure_Name]') AND type IN (N'P', N'PC')) BEGIN DROP PROCEDURE [Schema].[Procedure_Name] Print('Proceudre dropped => [Schema].[Procedure_Name]') END
확인 트리거 존재, 아래 링크를 클릭하여도 기능 http://www.gurujipoint.com/2017/05/check-if-exist-for-trigger-function-and.html IF
-
==============================
15.왜 같은 간단한 방법을 가지 마세요
왜 같은 간단한 방법을 가지 마세요
IF EXISTS(SELECT * FROM sys.procedures WHERE NAME LIKE 'uspBlackListGetAll') BEGIN DROP PROCEDURE uspBlackListGetAll END GO CREATE Procedure uspBlackListGetAll
..........
-
==============================
16.@Geoff I의 대답에 추가하여 SQL 파일 저장 프로 시저, 뷰, 함수 및 트리거에 대한 문을 생성하는 간단한 도구를 만들었습니다.
@Geoff I의 대답에 추가하여 SQL 파일 저장 프로 시저, 뷰, 함수 및 트리거에 대한 문을 생성하는 간단한 도구를 만들었습니다.
CodePlex의 @ MyDbUtils를 참조하십시오.
-
==============================
17.내가 궁금해! 왜 내가 좋아하는 전체 쿼리를 작성하지 않습니다
내가 궁금해! 왜 내가 좋아하는 전체 쿼리를 작성하지 않습니다
GO create procedure [dbo].[spAddNewClass] @ClassName varchar(20),@ClassFee int as begin insert into tblClass values (@ClassName,@ClassFee) end GO create procedure [dbo].[spAddNewSection] @SectionName varchar(20),@ClassID int as begin insert into tblSection values(@SectionName,@ClassID) end Go create procedure test as begin select * from tblstudent end
내가 이미 처음 두 절차는 이미 SQL은 처음 두 절차의 오류를 줄 것이다 쿼리를 실행합니다 존재하는 것을 알고 있지만 여전히 마지막 프로 시저를 만들 것 SQL 자체가 이미 존재 무엇을 돌보는되어 내가 항상 내 모든 클라이언트에 할 것입니다!
-
==============================
18.BEGIN) ( '당신의 시저 이름'절차 IF NOT 존재 CREATE ... END를
BEGIN) ( '당신의 시저 이름'절차 IF NOT 존재 CREATE ... END를
from https://stackoverflow.com/questions/2072086/how-to-check-if-a-stored-procedure-exists-before-creating-it by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 두 날짜 사이의 날짜 범위에서 데이터를 선택합니다 (0) | 2020.04.09 |
---|---|
[SQL] 기본 키 또는 고유 색인? (0) | 2020.04.09 |
[SQL] SQL에서 VARCHAR을 통해 CHAR를 선택하는 사용 사례는 무엇입니까? (0) | 2020.04.09 |
[SQL] 어떻게 설정 자동으로 PostgreSQL의에서 기본 키를 증가? (0) | 2020.04.09 |
[SQL] 파이썬에서 SQL 주입에 대해 보호 (0) | 2020.04.09 |