2009-07-24 2 views
0

미안하지만 TSQL을 처음 사용하므로 기본 지식조차 모릅니다. 나는이 함수에 대해 연구했지만 많은 구문 문제를 겪어왔다. 누군가이 기능을 작성하는 데 도움을 줄 수 있으면 감사하게 생각합니다.테이블 이름을 삭제하고 테이블을 삭제하는 TSQL 함수를 작성하는 방법


1. 나는 내가하고 싶은 드롭 액션
3.를 수행 한 후 오류를 확인하는 데 싶습니다
2. 테이블을 삭제하기 전에 테이블의 존재를 확인하는 데 싶습니다
4. 'No Action Needed'를 인쇄 할 필요가 없다는 것을 알았지 만, 작업을 약간 더 어렵게 만들려면 어쨌든 포함시키고 있습니다. 가능한 한 빨리, TSQL뿐만 아니라 가능한 내용 :
5. 나는

CREATE FUNCTION SAFE_DROP_TABLE(@TableName NVARCHAR(30)) 
AS 
BEGIN 
    IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(@TableName) AND TYPE IN (N'U'))   
     DROP TABLE @TableName 
     IF @@ERROR <> 0 
     BEGIN 
      PRINT 'Failed to drop ' + @TableName + ' Error = ' + @@ERROR 
     END ELSE BEGIN 
      PRINT 'dropped' + @TableName 
     END 
    ELSE 
     PRINT 'NO ACTION NEEDED' 
    END 
END 

목표를 정리하는 방법을 모르는 구문 오류 문제의 많은으로 실행했다. 가능한 많은 SQL을보고 쓰는 것이 필요합니다. 나는 시간을내어 반응하는 사람을 고맙게 생각합니다.

답변

3

함수가있는 테이블을 삭제할 수 없습니다. 저장 프로 시저에서 테이블을 삭제할 수 없습니다. (기능은 데이터베이스를 수정할 수 없습니다.)와 같은 뭔가 : 당신은이 작업을 수행하기 위해 EXEC를 사용해야합니다

CREATE PROCEDURE SAFE_DROP_TABLE(@TableName nvarchar(30)) 
AS 
BEGIN 

    IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(@TableName) 
    AND TYPE IN (N'U'))    
     EXEC ('DROP TABLE ' + @TableName) -- note change here 
     IF @@ERROR <> 0 
     BEGIN 
      PRINT 'Failed to drop ' + @TableName + ' Error = ' + @@ERROR 
     END ELSE BEGIN 
      PRINT 'dropped' + @TableName 
     END 
    ELSE 
     PRINT 'NO ACTION NEEDED' 
    END 

END 
+0

EXEC
http://unixwiz.net/techtips/sql-injection.html
가 ('DROP 표'QUOTENAME (@tablename가)) - 모든 테이블 이름을 처리 및 SQL 주입을 방지 –

2

합니다. 난 강력하게이 일을하지 않는 것이 좋습니다,

EXEC ('DROP 표'+ @tablename)

을하지만 : DROP 표를 말한다 라인에

, 당신은 할 것이다. 누구든지 테이블 이름 (또는 SQL 인젝션이라고 불리는 @TableName에 다른 유효한 SQL을 넣을 수 있고 모든 종류의 문제를 일으킬 수 있습니다.)

나는 배우려고 너무 깊이 들어가기 전에 일부 데이터베이스 이론을 읽었습니다. T-SQL 구문

SQL 주입 정보 :.. http://en.wikipedia.org/wiki/SQL_injection
http://msdn.microsoft.com/en-us/library/ms161953.aspx

+0

오직 그가 사용자 입력으로 proc를 호출한다면 - 분명히 권하지는 않습니다. –

+0

10 개의 테이블을 삭제해야한다고 가정 해 봅시다. 드롭 로직을 10 번 복사하여 붙여 넣어야합니까? 실제 상황에서 결코 일어나지 않는 시나리오를 10 개의 테이블에 떨어 뜨릴 수 있습니까? – MedicineMan

+0

비즈니스 논리의 일부로 테이블을 삭제하는 경우는 거의 없습니다. 테이블은 오래 동안 붙어 다니는 경향이 있습니다. –

관련 문제