SQL Server AFTER INSERT 트리거


10

내가 삽입을 텍스트로 만든 후이 트리거가 해고되고 싶지 marriedmarital_status열이 나는 지금까지 무엇을 가지고

ALTER TRIGGER [dbo].[marriage]
ON  [dbo].[applicant_personal_info]
AFTER INSERT
AS 
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
IF (SELECT [marital_status] FROM inserted) = 'married'
 BEGIN
     INSERT INTO [dbo].[applicant_marriage_info]([dom])
     VALUES('abc')
 END
END

답변:


11

여기서 발생하는 문제는 SQL Server에 Oracle이 수행하는 "FOR EACH ROW"트리거가 없다는 사실에서 비롯됩니다. 다중 행 변경을 처리하려면 트리거를 작성해야합니다. 즉, INSERTED 또는 DELETED 가상 테이블에 둘 이상의 행이있을 수 있습니다.

이러한 업데이트가 발생하면 (SELECT [marital_status] FROM inserted)여러 행을 반환하고 하위 쿼리가 단일 값을 반환하여 직접 비교에 사용 되므로 트리거가 실패 합니다.

트리거는 아마도 다음과 같이 보일 것입니다.

CREATE TRIGGER [dbo].[marriage] ON  [dbo].[applicant_personal_info] FOR INSERT
AS 
BEGIN
    SET NOCOUNT ON
    IF EXISTS (SELECT [marital_status] FROM INSERTED WHERE marital_status = 'married')
    BEGIN
        INSERT INTO [dbo].[applicant_marriage_info] ([dom])
        SELECT
            'abc' --Replace with whatever you're really inserting
        FROM INSERTED
        WHERE marital_status = 'married'
    END
END

8

따라서이 트리거는 실제로 필요한 것에 매우 가깝습니다. 이제 여기서 문제는 삽입 된 행이있는 경우 한 행만 신청자 _marriage_info에 삽입된다는 것입니다. 이것이 실제로 원하는 것입니까? 한 번에 여러 행이 삽입되면 어떻게됩니까?

ALTER TRIGGER [dbo].[marriage]
ON  [dbo].[applicant_personal_info]
AFTER INSERT
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    INSERT INTO [dbo].[applicant_marriage_info]([dom])
    SELECT 'abc' 
    FROM inserted 
    WHERE marital_status = 'married'
END

내가 보여준 것보다 더 많은 열이 필요할 것입니다.


이 데이터를 입력 할 때마다 수행되어야합니다
kabuto178

2
한 가지 방법은 마지막 부분을 다음과 같이 바꾸는 것입니다.BEGIN INSERT INTO [dbo].[applicant_marriage_info]([dom]) SELECT 'abc' FROM inserted WHERE marital_status = 'married' END
ypercubeᵀᴹ

이것을 설명하기 위해 샘플 코드를 약간 변경했습니다. IF EXISTS 비트가 더 이상 필요하지 않습니다. 삽입에 대해 쿼리를 실행하고 해당 데이터를 다른 테이블에로드하십시오. 내가 보여준 것보다 더 많은 열이 필요할 것입니다. 어떤 종류의 ID 일 수도 있지만 아이디어를 얻을 수도 있습니다.
mrdenny
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.