DB 60

@@IDENTITY, SCOPE_IDENTITY(), IDENT_CURRENT() 함수간의 차이점

테이블을 생성할 때, 일련번호를 할당하기 위하여 IDENTITY를 사용하게 됩니다. IDENTITY를 사용하할 때, 삽입한 행의 일련번호를 얻기 위하여 흔히 @@IDENTITY 함수를 자주 이용하게 되는데, @@IDENTITY 함수를 사용할 때 주의할 점이 있습니다. @@IDENTITY 함수는 현재 세션에서 삽입된 마지막 IDENTITY 값을 반환합니다. 따라서 트리거에서 다른 테이블의 IDENTITY가 새로 추가되거나 하게 되면 원치 않는 결과를 가져오게 됩니다.(@@IDENTITY 함수가 트리거에서 삽입된 IDENTITY 값을 반환함) 그래서 현재 범위(하나의 저장프로시저 내, 하나의 쿼리문 내 ...)내에서 마지막으로 추가된 IDENTITY 다음 값을 얻을 때는 SCOPE_IDENTITY() 함수를..

DB/MS-SQL 2010.02.05

SET IDENTTIY_INSERT 사용시 주의할 점.

세션에서 한 테이블의 IDENTITY_INSERT 속성만 ON으로 설정할 수 있습니다. CREATE TABLE IDENTITY1 ( id_no INT IDENTITY(1, 1), data1 VARCHAR(100) ) GO CREATE TABLE IDENTITY2 ( id_no INT IDENTITY(1, 1), data2 VARCHAR(100) ) GO SET IDENTITY_INSERT IDENTITY1 ON SET IDENTITY_INSERT IDENTITY2 ON 위 코드를 실행하면 아래와 같은 오류가 발생하게 됩니다. 메시지 8107, 수준 16, 상태 1, 줄 1 IDENTITY_INSERT is already ON for table 'master.dbo.IDENTITY1'. Cannot per..

DB/MS-SQL 2009.11.26

특정 문자열이 포함되어 있는 작업 찾기

엎서 특정 문자열을 포함하고 있는 저장 프로시저나 트리거를 찾는 방법에 대해서 보았는데, 연관하여 SQL 서버에 설정된 작업들 중에서 특정한 문자열을 포함하고 있는 작업을 찾을 때는 아래와 같이 하면 됩니다. USE msdb; GO; SELECT J.name, S.* FROM dbo.sysjobsteps S INNER JOIN dbo.sysjobs J ON J.job_id = S.job_id WHERE 1 = 1 AND command LIKE '%KEYWORD%' ORDER BY S.job_id, S.step_id;

DB/MS-SQL 2009.10.29

타 DB의 master를 복사하여 그대로 복구한 이후 SQLAgent 실행시 "SQLServerAgent could not be started" 오류 발생

원본 DB와 동일한 DB로 복구하기 위하여 원본 DB의 master 백업본으로 대상 DB에서 그대로 복원하였더니, SQL Agent를 시작하면 다음과 같은 오류가 발생하며 서비스 시작이 실패하는 문제가 발생하였습니다. 이벤트 형식: 오류 이벤트 원본: SQLSERVERAGENT 이벤트 범주: Service Control 이벤트 ID: 103 날짜: 2009-10-26 시간: 오후 4:18:14 사용자: N/A 컴퓨터: target 설명: SQLServerAgent could not be started (reason: 서버 '(local)'에 연결할 수 없습니다. SQLServerAgent을(를) 시작할 수 없습니다.). 자세한 정보는 http://go.microsoft.com/fwlink/events.a..

DB/MS-SQL 2009.10.26

MS-SQL 2005에서 백업 받은 DB를 복구한 이후 발생하는 로그인 불일치(Orphaned Users) 문제 해결 방법

원본 DB에서 백업 받은 파일을 다른 DB에서 복구할 경우, 원본 DB에서 설정된 로그인과 복구한 서버에서의 로그인(Login)과 복구한 DB의 사용자(User)이 서로 일치하지 않아서, 복구한 DB를 사용할 수 없는 문제가 발생합니다. 이런 경우(Orphaned Users) 2000에서는 해결 방법이 복잡하였으나, 2005부터는 간단히 해결을 할 수 있게 되었습니다. 먼저 로그인(Login)과 이름은 같지만 DB를 사용할 수 없는 사용자(User)들를 아래와 같이 찾습니다. USE ; GO; sp_change_users_login @Action='Report'; GO; 로그인과 일치하지 않는 사용자 문제를 아래와 같이 해결합니다. 물론 서로 일치하지 않는 로그인 및 DB 사용자가 동일하게 존재해야 합니..

DB/MS-SQL 2009.08.13

Owner 속성 오류로 데이터베이스(DB) 속성창이 열리지 않는 문제.

데이터베이스를 다른 장비로 그대로 이전한 이후에, SSMS에서 특정 DB의 속성창을 보려고 했더니, 다음과 같은 오류가 발생하였습니다. 제목: Microsoft SQL Server Management Studio ------------------------------ 요청한 대화 상자를 표시할 수 없습니다. ------------------------------ 추가 정보: 요청한 대화 상자를 표시할 수 없습니다. (SqlMgmt) ------------------------------ 데이터베이스 '[GatheringData_TEST]'에 속성 Owner을(를) 사용할 수 없습니다. 이 속성이 이 개체에 대해 존재하지 않거나 액세스 권한이 부족하여 검색하지 못할 수 있습니다. (Microsoft.Sql..

DB/MS-SQL 2009.07.09

OR 연산자 대신 IF을 사용하기

저장 프로시저내에 다음과 같은 쿼리가 있었습니다. 하지만, 특이하게도 특정한 경우에 부하가 많이 걸려서 성능이 제대로 나오지 않는 경우가 있었습니다. DECLARE @ISN INT, @parent_ISN INT SET @ISN = 123142 SELECT @parent_ISN=ISN FROM TEST_DB.dbo.test WITH (NOLOCK) WHERE 1 = 1 AND (linked_isn1 = @ISN OR linked_isn2 = @ISN) linked_isn1과 linked_isn2 각각의 컬럼에 독립적으로 인덱스가 잡혀 있었는데, 어느 때는 읽기 수가 1000이상이 나오면서 갑작스럽게 느려졌었습니다. 그래서 결국은 아래와 같이 IF문 형태로 코드를 변경하였습니다. 그랬더니, 이전과 같은 문제..

DB/MS-SQL 2009.06.06

분산 트랜잭션 설정

다음과 같이 분산 트랜잭션을 응용하여 저장 프로시저의 결과를 임시 테이블 변수에 집어 넣는 예제입니다. CREATE TABLE dbo.EMPLOYEE_SALES ( data_source VARCHAR(20) NOT NULL, employee_id VARCHAR(11) NOT NULL, last_name VARCHAR(40) NOT NULL, sales_dollars MONEY NOT NULL ); INSERT EMPLOYEE_SALES EXECUTE SOURCE.PUBS.dbo.usp_get_employee_sales DTC가 제대로 설정되어 있지 않으면, 다음과 같은 오류가 발생합니다. 연결된 서버 "SOURCE"의 OLE DB 공급자 "SQLNCLI"이(가) 메시지 "활성 중인 트랜잭션이 없습니다."..

DB/MS-SQL 2009.04.04
728x90