Skema mig her og skema mig der!

Når man kører C5 på SQL er det relativt vigtigt hvordan rettighederne opsættes – og især hvilket skema den enkelte tilgår databasen med – i hvert fald hvis der ændres i tabeldefinitioner.

Problemet er at C5 forudsætter at man har rettigheder til de pågældende tabeller (helst dbo=database owner) og selv om man kan tilgå SQL-databasen med et andet skemanavn, så går det galt hvis man skriver tabeldefinitioner. Så får de nemlig skemanavnet som de skrives med – og så har de andre brugere formentligt ikke adgang til dem.

Dvs. typisk vil man opleve denne fejl som at C5 viser en SQL-fejl om at man ikke har rettigheder til at tilgå tabellen og man kan så se i SQL manageren at tabellen har forkert skema.

Man kan i øvrigt ikke bare synkronisere C5s tabeller med SQL’en v.hj.a. synkroniseringskørslen i udviklingsmenuen – for den “forkerte” tabel indeholder jo alle data (så skal man da i hvert fald flytte den bagefter!).

Den letteste løsning er naturligvis at man fra starten af opsætter brugerne så de tilgår tabeller med et fælles korrekt skema – så går det aldrig galt.

Er det gået galt – dvs. man pludselig har en tabel med et andet skemanavn, hvori alle data ligger men som kun enkelte brugere har adgang til – så kan man heldigvis skifte skema på tabellerne direkte på SQL-serveren.

En enkelt table skiftes således:

ALTER SCHEMA [<nyt skema – typisk dbo eller C5Supervisor>] TRANSFER [<gammelt skema>].[<tabelnavn>];

Er det gået helt galt og man gerne vil have skiftet alle skemaer på alle tabeller, så kan det også arrangeres:

DECLARE tabcurs CURSOR FOR
  SELECT '<gammelt skema>.' + [name]
    FROM sysobjects
    WHERE xtype = 'u'
  OPEN tabcurs
  DECLARE @tname NVARCHAR(517)
  FETCH NEXT FROM tabcurs INTO @tname
  WHILE @@fetch_status = 0
  BEGIN
    EXEC sp_changeobjectowner @tname, '<nyt skema – typisk dbo eller C5Supervisor>'
    FETCH NEXT FROM tabcurs INTO @tname
  END
  CLOSE tabcurs
  DEALLOCATE tabcurs