SQL: Neexistující vazba mezi poli Knihy.Kniha a Polozky_dokladu.Cilovy_sklad
vydání: 20100115 - verze: 11
V případě, že došlo v datové struktuře V11 na MSSQL ke změně způsobu zachování referenční integrity z triggerů na cizí klíče, ztratila se vazba mezi poli Knihy.Kniha a Polozky_dokladu.Cilovy_sklad. Chybu je možno opravit spuštěním následujícího skriptu nad daným SQL serverem:
---------------------------------------------------------------------------------------------------------------------------------------------------------
declare @DBName sysname
declare DBNames cursor local for
select name from master.dbo.sysdatabases where name like 'Data%' and isnumeric(right(name, 4)) = 1 order by name
open DBNames
FETCH NEXT FROM DBNames INTO @DBName
WHILE @@FETCH_STATUS=0
BEGIN
print @DBName
execute
(
'use ' + @DBName + ' ' +
'
set nocount on
if not exists(select * from sysobjects where name = ''Knihy_UTrig'' and objectproperty(id, ''IsTrigger'') = 1)
execute(''
CREATE TRIGGER [dbo].[Knihy_UTrig] ON [dbo].[Knihy] FOR UPDATE AS
DECLARE @PocetRadku int
SELECT @PocetRadku = @@ROWCOUNT
SET NOCOUNT ON
IF UPDATE(Kniha)
IF @PocetRadku in (0, 1) or @@NESTLEVEL > 1
BEGIN
UPDATE Polozky_dokladu
SET Polozky_dokladu.Cilovy_sklad = inserted.Kniha
FROM Polozky_dokladu, deleted, inserted
WHERE deleted.Kniha = Polozky_dokladu.Cilovy_sklad
END
ELSE
begin
raiserror 50000 ''''Víceřádkové aktualizace primárního klíče jsou zakázány.''''
rollback transaction
end'')
if not exists(select * from sysobjects where name = ''Knihy_DTrig'' and objectproperty(id, ''IsTrigger'') = 1)
execute(''
CREATE TRIGGER [dbo].[Knihy_DTrig] ON [dbo].[Knihy] FOR DELETE AS
SET NOCOUNT ON
IF (SELECT COUNT(*) FROM deleted, Polozky_dokladu WHERE (deleted.Kniha = Polozky_dokladu.Cilovy_sklad)) > 0
BEGIN
RAISERROR 44445 ''''Záznam nelze odstranit ani změnit. Došlo by k porušení pravidel referenční integrity, protože v tabulce Polozky_dokladu existují související záznamy.''''
ROLLBACK TRANSACTION
END
'')
')
FETCH NEXT FROM DBNames INTO @DBName
END
close DBNames
deallocate DBNames
---------------------------------------------------------------------------------------------------------------------------------------------------------