안녕하세요.
매번 진심으로 감사드립니다.
다름아니라 화면단의 값을 받아서 db에 저장할때요...
금액이 이상하게 들어가면 메세지를 뛰워줄려는데 어떻게 해야할지 감이 안잡혀서요..
부탁좀 드릴께요..
S_MASTER
업체명 / 출하일자 / 총금액
->총금액은 S_DETAIL 테이블의 금액컬럼의 합계
S_DETAIL
품목 / 수량 / 단가 / 금액
-> 금액은 수량 * 단가 로 저장
이렇게 테이블값이 있으면요..
화면단에서 값을 입력후에 DB에 저장될때
먼저 S_DETAIL 테이블의 금액컬럼의 값이
수량 * 단가 와 다를경우에 값이 다릅니다 라는 오류메세지를
뿌려줄려고 합니다.
그럼 어떻게 트리거를 만들어야할지
워낙초보라서 감이 잘안서네요...
고수분들 조언좀 부탁드립니다.
어쩌다가 이일을 하게되어서 기초가 없는상태라 참힘드네요..
감사합니다.
Comment 2
-
무념
2013.04.30 17:10
-
건우아빠
2013.04.30 19:19
1.check 제약 조건을 이용하는 방법.
2. amt를 입력하지 마시고 그냥 계산 필드로 처리하시는 방법
3. 입력단에서 값을 체크하셔서 저장하기전에 미리 제어를 하시는게 가장 좋습니다..
4. 트리거로 에러 메시지 조절/ Raiserror 이용
1.check 제약 조건을 이용하는 방법.예시
create table testT
(
idx int identity(1,1) ,
col1 varchar(20) null ,
cost numeric null ,
qty numeric null ,
amt numeric null
)
ALTER TABLE testT ADD CONSTRAINT ck_numeric CHECK ( ISNUMERIC ( col1 ) = 1 );
GO
ALTER TABLE testT ADD CONSTRAINT ck_amt CHECK ( amt = cost * qty );
GO
insert into testT (col1 ,cost , qty , amt ) values('1111',1000 ,20, 20000)
insert into testT (col1 ,cost , qty , amt ) values('1111',1000 ,20, 21000)
BEGIN TRY
insert into testT (col1 ,cost , qty , amt ) values('1111',1000 ,20, 205000)
END TRY
BEGIN CATCH
SELECT
-- ERROR_NUMBER() AS ErrorNumber
-- ,ERROR_SEVERITY() AS ErrorSeverity
-- ,ERROR_STATE() AS ErrorState
-- ,ERROR_PROCEDURE() AS ErrorProcedure
-- ,ERROR_LINE() AS ErrorLine
case when CHARINDEX('ck_amt',ERROR_MESSAGE()) > 0
then '금액이 잘못 계산되었습니다.'
else
case when CHARINDEX('ck_numeric',ERROR_MESSAGE()) > 0
then 'col1에는 숫자만 입력하셔야 합니다.'
end
end
END CATCH;
트리거 사용은 자제하시는게 좋을 것 같습니다.
1. 저장 프로시저를 사용하여 처리 하시고 오류 및결과에 대한 리턴값을 받아서 출력해 주시는게 좋을 것 같습니다.