T-SQL 트리거 발사"란의 이름이나 번호를 제공한 값이 일치하지 않 테이블의 정의"오류
문제
여기에 내가 있을 수 없는 해결,그리고 나는 보았 어디에나.아마도 여기에 누군가가 알 것이다!
나이라는 테이블이 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 행하고 이해 트리거가 느려지요.
어쩌면 이것은 정말 대답하신의 문제이지만,방아쇠입니다 지금까지 최적의에서,나는 말을 했습니다.