다른 계정으로 구문을 테스트하고 싶을 때 로그인을 다시 할 필요없이 실행 유저를 변경하여 테스트할 수 있다.

-- 유저 변경
EXECUTE AS USER 'test_user'
go
 
-- 유저 확인
SELECT current_user;
go
  
/* 실행 구문 */
exec dbo.test_procedure
 
-- 되돌리기
revert;
go


데이터를 INSERT 시 아래와 같은 에러가 발생할 때가 있다.

Msg 8152, Level 16, State 14, Line 2
String or binary data would be truncated.
The statement has been terminated.

에러 내용과 같이 "데이터가 잘렸을 것이다" 라는 것은 INSERT 할 데이터가 해당 컬럼보다 클때 발생한다.

컬럼 사이즈를 조절하거나 넣을 데이터 사이즈를 조정해서 넣어주면 해결이 된다.

다음과 같이 테이블 속성을 변경하고 저장을 했을 때 삭제 후 다시 생성해야한다는 경고가 뜬다.

이 문제를 해결하기 위해서는 [도구]-[옵션]-[디자이너]-[테이블 및 데이터베이스 디자이너] 항목에서 "테이블을 다시 만들어야 하는 변경 내용 저장 안 함" 체크 해제한다.

데이터 파일과 로그 파일 경로 확인은 GUI, 쿼리를 통해 둘 다 가능하다.

우선 GUI에서는 [속성]-[파일] 에서 경로 뿐만아니라 증가량, 파일 형식, 파일 그룹 등 여러가지 정보를 확인할 수 있다.

다음과 같은 쿼리로도 확인이 가능하다.

sp_helpdb TEST_DB


SQL Server 2008 SSIS를 실행하다보면 다음과 같은 에러를 만날 수 있다.

SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80004005.
An OLE DB record is available. Source: "Microsoft SQL Server Native Client 10.0" Hresult: 0x00040EDA Description: "Warning: Null value is eliminated by an aggregate or other SET operation.".

실제로 SSMS 에서는 Warning 으로 그치지만 SSIS 에서는 에러로 인식하는 버그성 동작이고 이는 SQL Server 2012 에서 수정이 되었다.

 

Microsoft team's last update on the issue:
This problem was resolved in SQL Server 2012 RTM (11.00.2100.60 or later). There is no hotfix available for SQL Server 2005/2008/2008R2.

 


해결 방법은 해당 구문에 다음 구문을 추가하면 해결할 수 있다.

SET ANSI_WARNINGS OFF;


 

출처: https://stackoverflow.com/questions/13157508/why-does-a-null-aggregate-warning-in-an-sql-query-causes-the-ssis-package-to-fai


-- SQL Server Login 계정체크
SELECT Roles.Name
    ,Roles.Type_Desc
    ,Members.Name MemberName
    ,Members.Type_Desc
FROM sys.server_role_members RoleMembers
INNER JOIN sys.server_principals Roles ON Roles.Principal_Id = RoleMembers.Role_Principal_Id
INNER JOIN sys.server_principals Members ON Members.Principal_Id = RoleMembers.Member_Principal_Id
WHERE Members.name NOT LIKE '%system%' -- System's
    AND Members.name NOT LIKE '%SQLServer%' -- MSSQL2005 Servieces's
-- DB 사용자체크
SELECT @@Servername AS ServerName
    ,db_name() AS DBName
    ,Roles.Name
    ,Roles.Type_Desc AS RDesc
    ,Members.Name MemberName
    ,Members.Type_Desc AS MDesc
FROM sys.database_role_members RoleMembers
INNER JOIN sys.database_principals Roles ON Roles.Principal_Id = RoleMembers.Role_Principal_Id
INNER JOIN sys.database_principals Members ON Members.Principal_Id = RoleMembers.Member_Principal_Id

 

출처 : http://www.sqler.com/index.php?mid=bColumn&page=63&document_srl=144446

Service Broker 역할

Service Broker는 비동기 방식을 통해 서로 메시지를 보내고 받는 기능을 쉽게 구축할 수 있는 응용 프로그램이다. 응용 프로그램에서는 관련된 테스크 집합에 대한 이름인 '서비스'에 메시지를 보내고 내부 테이블 보기인 '큐'로부터 메시지를 받는다.

Service Broker는 응용 프로그램이 모든 메시지를 한 번만 받도록 한다. 이때 메시지는 전송된 순서대로 받는다.

메시지 순서 지정 및 조정

  • Service Broker 큐는 데이터베이스에 통합된다. 이는 일반 데이터베이스 유지 관리 및 운영에 Service Broker도 포함된다는 의미이다. 
  • 관련 메시지를 조정하고 순서를 지정한다. 각 메시지를 한 번만 받도록 보장하고 큐에 들어온 순서가 아니라 전송된 순서대로 받는다. 그러므로 응용 프로그램에서 메시지의 순서와 그룹화를 결정해야 한다. 
  • Service Broker 에서는 두 개의 큐 판독기가 같은 대화 또는 관련된 대화 그룹의 메시지를 동시에 처리하지 못하도록 한다.

일반적인 대화 방식은 다음과 같다.

  • 시작자에서
    • 프로그램이 대화를 시작한다.
    • 프로그램이 테스크 수행에 필요한 데이터가 포함된 메시지를 작성한다.
    • 프로그램이 메시지를 대상 서비스로 보낸다.
  • 대상에서
    • 메시지가 대상 서비스와 관련된 큐에 배치된다.
    • 응용 프로그램이 큐에서 메시지를 받고 작업을 수행한다.
    • 프로그램이 메시지를 시작자 서비스에 보내 응답한다.
  • 시작자에서
    • 응답 메시지가 시작자 서비스와 관련된 큐에 배치된다.
    • 프로그램이 응답을 받아 처리한다.

Service Broker는 각 대화에 대한 우선 순위를 1(낮음) - 10(높음) 범위에서 설정할 수 있도록 지원한다.

트랜잭션 비동기 프로그래밍

Service Broker 에서 메시지 전달은 트랜잭션 및 비동기 방식으로 수행된다. 트랜잭션이 롤벡될 경우 해당 트랜잭션 내의 모든 Service Broker 작업도 롤백된다.

큐는 데이터베이스 응용 프로그램과 관련하여 두 가지 이점이 있다.

  • 작업 요청이 큐에 배치되면 응용 프로그램은 대화형 사용자에게 즉시 응답할 수 있다. 응용 프로그램은 응답하기 전에 요청과 관련된 모든 작업이 완료될 때까지 기다릴 필요가 없다. 리소스가 사용 가능해지면 큐에 대기 중인 요청이 처리된다. 따라서 효율적인 리소스 사용이 가능하다.
  • 경우에 따라 한 개의 요청과 관련된 작업을 여러 개의 작업 단위로 구분하여 별도의 트랜잭션으로 처리할 수 있다. 이 경우 데이터베이스 응용 프로그램은 요청을 큐에 배치하여 각 작업 단위를 시작할 수 있다.

Service Broker 장점

데이터베이스 통합

SQL Server와의 통합을 통해 외부 DTC(Distributed Transaction Coordinator)에 대한 추가적인 오버헤드 및 복잡성 없이 틀내잭션 메시지를 사용할 수 있다. 응용 프로그램에서는 트랜잭션을 커밋할 때까지 어떤 작업도 이루어지지 않는다.

데이터, 메시지 및 응용 프로그램 논리가 모두 데이터베이스에 있으면 응용 프로그램의 관리가 쉬워진다.

공통 개발 환경도 데이터베이스 통합의 장점이다. Service Broker 서비스를 구현하는 프로시저는 Transact-SQL 또는 CLR (공용 언어 런타임) 언어 중 하나로 작성할 수 있다.

메시지 순서 지정 및 조정

Service Broker는 메시지 순서, 고유한 배달 및 대화 식별을 자동으로 처리한다. 두 Service Broker의 끝점 사이에 대화가 설정되고 나면 응용 프로그램에서는 각 메시지를 보낸 순서대로 한 번씩만 메시지를 받는다. 사용자 응용 프로그램에서는 추가 코드 없이 순서대로 정확히 한 번씩만 메시지를 처리할 수 있다. 그리고 모든 메시지에 자동으로 식별자를 포함한다. 응용 프로그램에서는 항상 특성 메시지가 속해 있는 대화를 알려 준다.

느슨한 연결 및 작업 유연성

응용 프로그램에서는 큐에 메시지를 보낸 다음 계속하여 응용 프로그램 처리를 진행하되 Service Broker를 통해 메시지가 대상에 도착했는지 확인할 수 있다. 이처럼 연결이 느슨하면 유연한 일정 예약이 가능하다. 시작자는 여러 메시지를 내보낼 수 있고 여러 대상 서비스에서는 이를 병렬로 처리할 수 있다.

또한 큐 작업을 통해 시스템에서는 더욱 공평하게 처리를 배포할 수 있으므로 서버에 필요한 최대 용량도 줄어든다. 이러면 전반적인 처리량과 성능이 향상된다. 

대상을 즉시 사용할 수 없는 경우 메시지는 보내는 데이터베이스의 전송 큐에 남는다. Service Broker에서는 메시지가 전송될 때까지 또는 대화의 수명이 만료될 때까지 메시지를 다시 시도하여 하나의 서비스가 대화 중 특정 시점에 잠시 사용 불가능하게 되더라도 두 서비스 사이의 안정적인 대화가 계속 진행될 수 있도록 한다.

관련 메시지 잠금

Service Broker에서는 큐 내의 메시지 읽기 작업을 병렬로 처리 시 대화 그룹 잠금을 통해 이러한 문제가 발생하지 않도록 한다.

자동 활성화

활성화를 사용하면 응용 프로그램이 큐에 도착하는 메시지 볼륨에 맞게 크기를 동적으로 조정할 수 있다. 

Service Broker는 큐의 작업을 모니터링하여 사용 가능한 메시지가 있는 모든 대화에 대해 응용 프로그램이 메시지를 받는지 여부를 확인합니다. Service Broker 활성화는 큐 판독기가 수행할 작업이 있을 때 새 큐 판독기를 시작한다. 큐 판독기가 수행할 작업이 있는 시기를 확인하기 위해 Service Broker에서는 큐의 작업을 모니터링한다. 큐 판독기의 수가 들어오는 트래픽에 일치할 경우 큐는 정기적으로 큐가 비어 있는 상태 또는 큐의 모든 메시지가 다른 큐 판독기에서 처리 중인 대화에 속하는 상태에 이르게 된다. 큐가 일정 기간 동안 이러한 상태에 이르지 않으면 Service Broker는 다른 응용 프로그램 인스턴스를 활성화한다.

응용 프로그램은 데이터베이스 내부에서 실행되는 프로그램과 데이터베이스 외부에서 실행되는 프로그램에 대해 서로 다른 활성화 방법을 사용한다. 데이터베이스 내부의 프로그램에 대해서 Service Broker는 큐에서 지정한 저장 프로시저의 다른 사본을 시작한다. 데이터베이스 외부의 프로그램에 대해서 Service Broker는 활성화 이벤트를 생성한다. 이 이벤트를 모니터링하여 다른 큐 판독기가 필요한 시기를 확인할 수 있다.

Service Broker는 활성화를 통해 시작된 프로그램을 중지하지 않는다. 대신 활성화된 응용 프로그램은 메시지가 도착하지 않은 일정 기간 이후 자동으로 종료되도록 작성된다. 이러한 방법으로 설계된 응용 프로그램을 사용함으로써 서비스에 대한 트래픽 변경으로 인해 여러 응용 프로그램 인스턴스가 동적으로 증가하고 감소할 수 있다. 또한 시스템이 종료되거나 재부팅되면 시스템을 다시 시작할 때 응용프로그램에서 자동으로 큐의 메시지를 읽기 시작한다.

Service Broker 일반 용도

비동기 트리거

OLTP 시스템과 같이 트리거를 사용하는 응용 프로그램은 Service Broker를 유용하게 활용할 수 있는 경우가 많다. 트리거는 Service Broker 서비스에서 요청이 작동하는 메시지를 대기시킨다. 트리거는 요청된 작업을 실제로 수행하지 않는다. 대신 수행할 작업에 대한 정보가 포함된 메시지를 만들고 해당 작업을 수행하는 서비스에 이 메시지를 보낸다. 그런 다음 트리거는 반환된다.

안정적인 쿼리 처리

안정적인 쿼리 처리가 필요한 응용 프로그램은 Service Broker 서비스에 메시지를 보내 쿼리를 전송할 수 있다. 서비스를 구현하는 응용 프로그램은 메시지를 읽고 쿼리를 실행하며 결과를 반환한다. 이 작업은 모두 같은 트랜잭션이 커밋되기 전에 오류가 발생하면 전체 트랜잭션이 롤백되고 메시지가 큐로 반환된다.

안정적인 데이터 수집

큰 원본 집합에서 데이터를 수집하는 응용 프로그램은 Service Broker를 통해 안정적으로 데이터를 수집할 수 있다. 

클라이언트 응용 프로그램에 대한 서버 측 분산 처리

여러 SQL Server 데이터베이스에 액세스하는 대형 응용 프로그램은 Service Broker를 유용하게 활용할 수 있다.

클라이언트 응용 프로그램에 대한 데이터 통합

여러 데이터베이스의 정보를 동시에 사용하거나 표시해야 하는 응용 프로그램은 Service Broker를 활용할 수 있다.

대량 일괄 처리

대량 일괄 처리를 수행해야 하는 응용 프로그램은 Service Broker에 제공되는 큐 및 병렬 처리 기능을 통해 많은 작업을 신속하고 효율적으로 처리할 수 있다. 응용 프로그램은 처리할 데이터를 Service Broker 큐에 저장한다. 프로그램은 정기적으로 큐에서 데이터를 읽고 해당 데이터를 처리한다. 응용 프로그램은 Service Broker에 제공되는 안정적인 메시징 기능을 통해 요청이 시작된 컴퓨터 이외의 다른 컴퓨터에서 일괄 처리를 수행할 수 있다.

출처: SQL Server Books Online

SQL Server에서 Error log는 SSMS 에서는 [관리]-[Sql Server 로그] 에서 확인이 가능하고 또한, 쿼리로도 확인이 가능하다. 

sp_readerrorlog
  
LogDate                 ProcessInfo  Text
----------------------- ------------ --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2018-07-23 12:13:16.530 Server       Microsoft SQL Server 2017 (RTM) - 14.0.1000.169 (X64)
    Aug 22 2017 17:04:49
    Copyright (C) 2017 Microsoft Corporation
    Developer Edition (64-biton Windows 10 Pro 10.0 <X64> (Build 16299: )
2018-07-23 12:13:16.530 Server       UTC adjustment: 9:00
2018-07-23 12:13:16.530 Server       (c) Microsoft Corporation.
2018-07-23 12:13:16.530 Server       All rights reserved.
2018-07-23 12:13:16.530 Server       Server process ID is 5056.
2018-07-23 12:13:16.530 Server       System Manufacturer: 'HP', System Model: 'HP 280 G3 MT'.
2018-07-23 12:13:16.530 Server       Authentication mode is WINDOWS-ONLY.
2018-07-23 12:13:16.530 Server       Logging SQL Server messages in file 'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\Log\ERRORLOG'.
2018-07-23 12:13:16.540 Server       The service account is 'NT Service\MSSQLSERVER'. This is an informational message; no user action is required.
2018-07-23 12:13:16.540 Server       Registry startup parameters:
     -d C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\master.mdf
     -e C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\Log\ERRORLOG
     -l C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQL
2018-07-23 12:13:16.540 Server       Command Line Startup Parameters:
     -s "MSSQLSERVER"
2018-07-23 12:13:18.330 Server       SQL Server detected 1 sockets with 4 cores per socket and 4 logical processors per socket, 4 total logical processors; using 4 logical processors based on SQL Server licensing. This is an informational message; no user action is required.
2018-07-23 12:13:18.330 Server       SQL Server is starting at normal priority base (=7). This is an informational message onlyNo user action is required.
...


테이블 생성 시 해당 에러문구가 보이면 TEXTIMAGE_ON 절 삭제

Cannot use TEXTIMAGE_ON when a table has no text, ntext, image, varchar(max), nvarchar(max), varbinary(max), xml or large CLR type columns.

CREATE TABLE [dbo].[TABLENAME] (

...

...

)  ON [DATA] TEXTIMAGE_ON [DATA] <-----삭제

...

..

 

SSIS CSV 파일 날짜 저장 관련 건 관련하여 방법 공유 드립니다.

 

대상을 파일로 저장하기 위해서는 도구 상자에서 플랫 파일 대상을 선택합니다.

 

새로 만들기를 선택합니다.

 

 

연결 관리자 이름과 파일을 저장 시킬 경로를 설정합니다.

 

 

CSV 로 저장하는 것을 확인하기 위해 열 탭에서 열 구분 기호가 쉼표(,)인지 확인합니다.

 

그리고 이제 날짜 포멧으로 저장하기 위하여 해당 연결 관리자 속성에서 Expression 항목을 수정합니다.

 

속성 식 편집기에서 ConnectionString 을 선택한 후 수정합니다.

 

밑의 식 창에서 저장시킬 파일 포멧 식을 작성합니다.

 

"D:\\test\\test__" +(DT_STR,4,1252)DATEPART( "yyyy" , getdate() ) + RIGHT("0" + (DT_STR,4,1252)DATEPART( "mm" , getdate() ), 2) + RIGHT("0" + (DT_STR,4,1252)DATEPART( "dd" , getdate() ), 2) + "_" + RIGHT("0" + (DT_STR,4,1252)DATEPART( "hh" , getdate() ), 2)  + "_" + RIGHT("0" + (DT_STR,4,1252)DATEPART( "mi" , getdate() ), 2)  + "_" + RIGHT("0" + (DT_STR,4,1252)DATEPART( "ss" , getdate() ), 2)   +".csv"

 

그리고 패키지 실행 후 해당 경로의 파일을 확인해보면 파일이 작성한 포멧으로 파일이 저장되어 있는 것을 확인할 수 있습니다.

+ Recent posts