Avatar billede hrc Mester
05. marts 2008 - 14:28 Der er 4 kommentarer og
1 løsning

Sletning af bit-felt i SQL2000 fejler

Prøver at køre scriptet:

  alter table mytable drop column myflag

Vil af med bit-feltet myflag, men det kan jeg ikke. Andre typer går det fint med. I første omgang troede jeg det havde noget med et indeks på et bit-felt (vanvittigt på et bit-felt, men min query fandt faktisk et indeks som også MSDE Manageren kunne se):

select so.id, so.name as tablename,
      sc.colid, sc.name as columnname,
      si.indid, si.name as indexname
  from sysobjects so
  join syscolumns sc on (sc.id = so.id)
  join sysindexes si on (si.id = so.id)
  join sysindexkeys sik on (sik.id = sc.id
                        and sik.colid = sc.colid
                        and sik.indid = si.indid)
  where (so.name = :tablename)
    and (sc.name = :fieldname)

Det indeks kan jeg ikke droppe og i Enterprise Manageren findes det heller ikke.

Nå men, når jeg forsøgte at droppe feltet kom følgende fejlmeddelelse:

  "The object 'DM_mytable_myfield_DADADADA' is dependent on column 'myfield'

Denne record findes i SysObjects og xtypen er "D". Hvad betyder linjen og hvordan sletter jeg feltet? Det kan ikke passe jeg skal slette direkte i SysObjects, vel?
Avatar billede ldanielsen Nybegynder
05. marts 2008 - 18:48 #1
Måske er det en default value? Den er også registreret som et index
Avatar billede ldanielsen Nybegynder
05. marts 2008 - 18:59 #2
Det lader til at du faktisk skal slette den 'manuelt', med drop constraint (nej, du skal ikke selv slette i tabellen SysObjects). Her diskuteres det, og der er en dynamisk løsning der udleder navnet på constraint'en

http://thecodersblog.blogspot.com/2007/06/alter-or-drop-column-with-default-value.html
Avatar billede hrc Mester
06. marts 2008 - 08:08 #3
Du har helt ret. Der er en default værdi på bitten. Da SQL2000 eksplicit nævnes må man håbe den slags er rettet i nyere versioner. Mange tak for linket.
Avatar billede hrc Mester
06. marts 2008 - 08:34 #4
Endte med dette script til at finde navnet:

select so.id, so.name, sc.colid, sc.name as fieldname,
      so2.name as constraintname
  from sysobjects so
  join syscolumns sc on (sc.id = so.id)
  join sysconstraints sco on (sco.id = so.id and sco.colid = sc.colid)
  join sysobjects so2 on (so2.id = sco.constid)
  where (so.name = :tablename)
    and (sc.name = :fieldname)

Det var lidt "tricky" mht. sysconstraints. Kunne ikke finde den som tabel, men scriptet virkede. Først ret sent kom jeg til at tænke på der fandtes "views".
Avatar billede ldanielsen Nybegynder
10. marts 2008 - 22:36 #5
Selv tak :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester