Avatar billede hrc Mester
22. september 2010 - 14:16 Der er 2 kommentarer og
1 løsning

Finde funktion som kalkulerede felt kalder

Jeg har tabeller hvor nogle felter er beregnede. De kalder funktioner som leverer data. Det ser elegant ud men det har nogle uhensigtsmæssigheder (de ydelsesmæssige er acceptable).

Ved snapshot replikation til "subscriber" fejler det, da funktionen i en tabel kræver en anden tabel findes. Den anden tabel kræver oveni, at den første tabel findes. Det bider sig i halen.

Endelig kan man ikke droppe en funktion som refereres af et felt.

Jeg har et par løsningsmuligheder:

1. Ved oprettelse af den decentrale database, oprettes alle funktionerne som stubbe. Desværre har replikeringen kun muligheden for at droppe eller at holde nalderne væk, hvis "artiklen" findes. En stub vil derfor ikke blive opdateret med en fungerende

2. Finde alle kalkulerede felter og fjerne dem fra tabellerne. Derefter "pushe" en subscription og lægge alle felterne tilbage igen

2a. Det kan hårdkodes! Det er grimt men vil virke. Ulempen er vedligeholdet.

2b. Jeg kan pløje gennem SysObject og SysColumns / information_schema for at finde felterne. Dernæst finde de funktioner som felterne bruger.

Jeg er afgjort mest interesseret i 2a, men kan ikke finde funktionen ud fra felterne fundet i SysObjects.

Er der nogen der kan hjælpe med et script som kan vise tilhørsforholdet mellem felt og funktion? Enten via Sys-viewene eller til information_scheme ditto?
Avatar billede hrc Mester
22. september 2010 - 14:23 #1
Rettelse. Jeg er interesseret i løsning 2b!
Avatar billede hrc Mester
22. september 2010 - 14:38 #2
Jeg har vist allerede fundet løsningen. Der findes minsanten et view der hedder sys.computed_columns. Her findes definitionen. Jeg lukker igen.
Avatar billede hrc Mester
22. september 2010 - 14:50 #3
Scriptet ser således ud:

SELECT so.id, so.NAME AS tablename, sc.NAME AS fieldname, t.name AS datatype, cc.definition
FROM syscolumns sc
JOIN sysobjects so ON (so.id = sc.id AND so.xtype = 'U')
JOIN sys.types t ON (t.system_type_id = sc.xtype)
JOIN sys.computed_columns cc ON (cc.object_id = so.id AND cc.column_id = sc.colid)
WHERE (sc.iscomputed = 1)
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