T-SQL 트리거 발사"란의 이름이나 번호를 제공한 값이 일치하지 않 테이블의 정의"오류

StackOverflow https://stackoverflow.com/questions/95218

  •  01-07-2019
  •  | 
  •  

문제

여기에 내가 있을 수 없는 해결,그리고 나는 보았 어디에나.아마도 여기에 누군가가 알 것이다!

나이라는 테이블이 dandb_raw,열 특히:dunsId(PK),이름,searchName.나도 트리거하는 행위에 이 테이블:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dandb_raw_searchNames]
    ON [dandb_raw]
    FOR INSERT, UPDATE
    AS

SET NOCOUNT ON

  select dunsId, name into #magic from inserted

        UPDATE dandb
            SET dandb.searchName = company_generateSearchName(dandb.name)
            FROM (select dunsId, name from #magic) i
            INNER JOIN dandb_raw dandb
                on i.dunsId = dandb.dunsId


        --Add new search matches
        SELECT c.companyId, dandb.dunsId
            INTO #newMatches
            FROM dandb_raw dandb
            INNER JOIN (select dunsId, name from #magic) a
                on a.dunsId = dandb.dunsId
            INNER JOIN companies c
                ON dandb.searchName = c.searchBrand
                --avoid url matches that are potentially wrong
                AND (lower(dandb.url) = lower(c.url)
                    OR dandb.url = ''
                    OR c.url = ''
                    OR c.url is null)


        INSERT INTO #newMatches (companyId, dunsId)
        SELECT c.companyId, max(dandb.dunsId) dunsId
            FROM dandb_raw dandb
            INNER JOIN
                (
                    select
                    case when charindex('/',url) <> 0 then left(url, charindex('/',url)-1)
                    else url
                    end urlMatch, * from companies
                ) c
                ON dandb.url = c.urlMatch
            where subsidiaryOf = 1 and isReported = 1 and dandb.url <> ''
                and c.companyId not in (select companyId from #newMatches)
            group by companyId
            having count(dandb.dunsId) = 1

        UPDATE cd
            SET cd.dunsId = nm.dunsId
            FROM companies_dandb cd
            INNER JOIN #newMatches nm
                ON cd.companyId = nm.companyId
GO

의 트리거를 삽입 실패:

insert into  [dandb_raw](dunsId, name)
    select 3442355, 'harper'
    union all
    select 34425355, 'har 466per'
update [dandb_raw] set name ='grap6767e'

으로 이 오류가 발생할 수 있습니다.

Msg 213, Level 16, State 1, Procedure companies_contactInfo_updateTerritories, Line 20
Insert Error: Column name or number of supplied values does not match table definition.

가장 흥미로운 것에 대해 이는 각 개인의 문에서 트리거에서 작동합니다.그것처럼 거의 삽입은 하나 테이블을 감염시키는 임시 테이블을 이동하려는 경우에 삽입된 그들 중 하나입니다.

그 원인은 무엇 트리거가 실패하는가?어떻게 멈출 수 있죠?

도움이 되었습니까?

해결책

나는 생각한 다윗과 체르보 결합돌에서 문제가 여기에.

나는 신의 일부분 무슨 일이 일어나고 있었기 때문이었을 사용하여#newMatches 에 여러 개의 트리거합니다.하나 트리거의 일부를 변경하는 행,그것은 화재 다른 트리거,어떤 것을 사용하려고 시도는 연결 범위#newMatches.

결과적으로,그것은 것입하려고 찾아,테이블이 이미 존재하는 다른키다가 죽고 생산 위의 메시지.의 한 조각을 증거하는 것에 찬:가 삽입되는 사용할 스택 스타일의 범위(중첩된 트리거 있는 자신의 inserteds?)

여전히 추측하지만 적어도 일을 작동하는 것처럼 보이 지금!

다른 팁

는 무엇입 companies_contactInfo_updateTerritories?실제 기준을 언급 절차"companies_contactInfo_updateTerritories"하지만 난 그것을 참조 코드에서는 주어진다.도 보이지 않는 곳입니다.지 않는 한 그것은에서 호출하고 있는 응용 프로그램을 SQL 고,따라서 관련이 있습니다....

당신이 모든 것을 테스트하고 일했지만 지금은 문제가 해결되지 않으면,다음 뭔가 달라야합니다.중 하나 고려해야 할 점은 보안입니다.나는 당신을 호출 테이블[dandb_raw]와[dbo].[dandb_raw].그렇다면 사용자의 테이블이 있었 같은 이름의[사용자].[dandb_raw],는 테이블에 사용되는 것을 확인하는 정신이다.또한,방아쇠를 만듭 temp 테이블이 있습니다.하지만 경우에는 일부의 임시 테이블이 이미 존재하는 어떤 이유로든지 다른 정의를,이 문제가 될 수 있고.

보이지 않는데 명백한 문제에 코드입니다.

"선택합니다..으로는"약한 쿵푸.도 명시적으로 만들기 temp 표 정의:

CREATE TABLE #newMatches
(
  CompanyID int PRIMARY KEY,
  DunsID int
)

당신이 완료되면으로#newMatches,당신은 그것을 제거할 수 있도록 만들기를 나중에 다시(임시 테이블이 연결 범위!!)

DROP TABLE #newMatches

트 코드(기 때문에 그것을 실행해야 합니다 매번 데이터를 업데이트)어야 한 효율적이고 합 계정에 대해 여러 레코드 삽입합니다.당신은 성공했에서 두 번째 하지만 처음이 아니다.당신은이 지나치게 복잡하고 사용하는 것과 같은지 않는 문장은 일반적으로 적 efficeint 를 사용하는 것보다 왼쪽입니다.임시 테이블이 불필요한 여기에는(I 지 않을 것 중 하나를 사용하는 것이 좋에서 트리거)로 그들이 추가 비효율성의 트리거입니다.이지 않는 이유를 쓰 에서 삽입한 나 대 부터(선택 dunsId,에서 이름#마법)가

첫 번째가 될 가능성이 더 빠르고 간단하게 읽고 유지합니다.

여기:가입(를 선택하는 경우 반환('/',url) <>0 음(url,반환('/',url)-1)다른 url 끝 urlMatch,*회사로부터)c 에 dandb.url=c.urlMatch

당신이 선정하고 있는 모든 분야에서 테이블에도 당신은 단지 나타날 수 있습니다.왜?당신은 또한 실행하는 경우 stament 에 모든 레코드 회사는 비록한 후에 가입하지 않을 수도 있습 그들 모두 필요합니다.

또한 일반적인 내가 피를 사용하여 선택하시지만 특히 트리거입니다.당신이 당신 삽입하는 또 다른 테이블을 선택 사용*일부 테이블에 합류를 삽입 또는 삭제됩니다.에 열을 추가하는 테이블을 일으킬 것이 트리거가 실패하고 모든 데이터 변경 내용까지 그 수정되었습니다.

당신은 또한이 사용하는 함수에서 트리거입니다.이 coudl 될 고통스럽게 느린 경우 총형 삽입합니다.나는 당신 테스트 업데이트하여 큰 그룹의 기록을 확인합니다.모든 데이터 변경이 발생하지 않는 단지 사용자 인터페이스에서,하나의 레코드에서 시간입니다.시간이 있을 것이 하나의 분야에서 업데이트 ad-hoc 에서 쿼리를 관리 스튜디오(할 때 모든 가격은 필요에 의해 조정될 10%으로 가장 간단한 예제는 마음에 온다.) 귀하의 트리거를 요구를 처리할 수 있는 그 형태는 경우 업데이트뿐만 아니라는 사람입니다.나는 것입 테스트 사례를 실행 업데이트 100000 행하고 이해 트리거가 느려지요.

어쩌면 이것은 정말 대답하신의 문제이지만,방아쇠입니다 지금까지 최적의에서,나는 말을 했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top