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
---------------------------------------------------------------------------------------------------------------------------------------------------------