Jag skall konstuera ett program som ligger och söker igenom en SQL databas efter vissa fel, och sedan genererar en felrapport som ett mail. Det är ett "script" som körs inuti DTS (i Enterprise Manager) Start - Program - Microsoft SQL Server - Enterprise Manager Ok, nu sitter jag inte vid datorn där SQL servern ligger dock, måste jag det? VBScript funkar. Kan ett sådant script kontrollera inkommande frågor till databasen? En mycket stor produkt och kunddatabas används av väldigt många. Triggers låter ju som en bra idé, vet ju inte om det är många tabeller som ska kontrolleras men det funkar väl ? Jag vet faktiskt inte hur datat kommer in i servern. Skulle tro att det är direkta SQL satser, Då kan du försöka logga med SQL Profiler. Kan man använda SQL profiler till att förhindra att data skrivs till databasen (om den inte uppfyller vissa vilkor, t.ex. angivna i ett script)? Ok det ingår i SQL server. Profilern visar (mer eller mindre i realtid) vad som pågår i servern. Projektet skall få alla applikationer att göra rätt. Det låter som om databasen (databaserna) skulle behöva lite primärnycklar och främmande nycklar istället. Det handlar inte om värden som databasen inte kan ta emot utan värden som En trigger är kod som körs automatiskt. Låter precis som det jag behöver! Kan error meddelandet skickas ut till alla olika applikationer Ja, felmeddelanden från SQL Server går tillbaka till den som ställde frågan. Kan man då direkt i databasen ange villka vilkor som måste uppfyllas för de olika fälten, <Kan man då direkt i databasen ange villka vilkor som måste uppfyllas för de olika fälten, Det är inte så mycket att lära sig med check constraints. Nedanstående länkar visar nästan allt man behöver veta. Kolla annars MSDN. Det verkade inte som om SQL server 200 stödjer "User Defined Constraines", vilket ju är det jag skulle behöva använda för att implimentera mina sepcifika affärsregler. SQL Server stödjer visst constraints: Bryter man mot ett Constraint så genererar SQL Server ett felmeddelande (t.ex. Violation of Check Constraint). Applikationen som anropar databasen får tillbaka detta felmeddelande och lämpligtvis implementerar man en felhanteringsfunktion som visar felet för användaren på ett snyggt sätt. Ja det såg jag, det jag menade var att den inte verkar stödja "user defined" constraines, vilka är sådana constraines där man själv anger affärsregler för vad som är godtagbara data! Och vad kan du mer begära??? Ok, ett fält innehåller ålder, ett fält inehåller födelsedatum ett fäl innehåller det datum då posten lades till. Jag vill kontrollera att åldern stämmer m.a.p födelsedatum och det datum då posten lades till. Här är ett förslag på Check Constraint:Felsöka SQL datbas
Hur kan jag bäst göra detta!
Fungerar det med ett script?Sv: Felsöka SQL datbas
Så fort du har en SQL Server har du en DTS installerad.
/mickeSv: Felsöka SQL datbas
Sen hittar du DTS under fliken Data Transformation Services
/mickeSv: Felsöka SQL datbas
Sv: Felsöka SQL datbas
Du måste ha Enterprise Manager, men inte sitta lokalt.
/mickeSv: Felsöka SQL datbas
Alltså kan man använda ett script för att kontrollera att data som skall sättas in i databasen är korrekt
och kanske t.om. hindra instättning i databasen om datat inte är korrekt?Sv: Felsöka SQL datbas
Data läggs till i databasen ifrån en mängd olika system, och ibland läggs felaktiga värden in.
Jag skulle vilja kontrollera att endast giltiga värden läggs in.
Om någon försöker lägga in ett ogiltigt värde skall detta helst hindras, eller iaf raporteras.
Jag vill alltså helst "fånga" datat inann det läggs till databasen, eller precis när det gör det!!
Är detta möjligt?Sv: Felsöka SQL datbas
Överblicken blir lite si o så när det kan vara flera tabeller som uppdateras med "samma SQL".
Hur kommer datat in i servern - är det via direkta SQL-satser, procedurer, replikeringar eller kanske fil-importer ?
/JohanSv: Felsöka SQL datbas
men som sagt det är en rad olika system som lägger till eller uppdaterar poset i databasen,
och det skulle inte förvåna mig om de verkar på olika sätt.
Hur kan jag ta reda på det?Sv: Felsöka SQL datbas
Ja, den bör man köra lokalt på servern.
/mickeSv: Felsöka SQL datbas
Sv: Felsöka SQL datbas
Är det i SQL profiler man bör göra all kontroll av inkommande data istället
för i Enterprise Manager?Sv: Felsöka SQL datbas
Kolla triggers : varje tabell kan ha "programsnuttar" som körs vid insert, update och delete.
Måste du validera många tabeller/fält ?
Är det här ett projekt för att få alla applikationer att göra rätt eller ska "försvaret" ligga aktivt jämt ?
Finns ju ofta en logg att undersöka annars - där ser man ju vad som hänt.
/JohanSv: Felsöka SQL datbas
T.ex. läggs poster till med ogiltiga Produkt ID,
detta skall inte kunna ske.
Men då ett stort antal olika typer av applikationer som gör dessa insättningar,så blir det omöjligt att göra kontrollen där.
Kontrollen måste alltså ske på SQL servern,
Är detta ens möjligt?Sv: Felsöka SQL datbas
Vad händer med klienten om servern vägrar att ta emot ett värde? Kommer inte den klaga då? Då måste du ju ändå skriva om klienten så den tar hand om detta.
Annars lutar det mest åt triggrar, som nämnts innan. En kodsnutt som fångar upp det som lagts in, validerar och (förhoppningsvis) godkänner inmatningen. Vid misslyckad validering genereras fel, som klienten måste ta hand om.
/mickeSv: Felsöka SQL datbas
jag vet är fel, t.ex. så ska kanske prodID bara kunna vara 3 om Lokation är 5 osv..
Det där med triggrar verkar intressant,
skulle du kunna förklara lite mer om hur det fungerar?
(eller ge mig en länk vilket är så populärt)Sv: Felsöka SQL datbas
Låt oss säga att du inte tillåter värdet 'Sill' i [product] fältet.
Då kan du göra ungefär såhär:
CREATE TRIGGER [bongo] ON Produkttabellen
FOR INSERT,UPDATE --Den går igång på Inserts och updates...
AS
IF (SELECT [product] FROM inserted) = 'Sill'
BEGIN
RAISERROR ('Sill är inte tillåtet',16 ,1)
ROLLBACK TRANSACTION
END
GO
Försöker du nu inserta eller ändra en rad till 'Sill', så får du ett fel.
Dessutom går ändringen inte igenom.
OBS!!!!!!
Om du kör med egendefinierade transaktioner (MTS/COM+/ADO) så kommer
ROLLBACK ställa till det för dig. Då skippar du bara den...
Nu är det upp till din fantasi att tillåta eller inte tillåta värden.
/mickeSv: Felsöka SQL datbas
Något jag får läsa på lite dock!
Jag skall göra detta på en SQL server,
vart lägger jag till de här trigger scripten?Sv: Felsöka SQL datbas
som använder databasen?
Det är allt ifrån webbapplikationer, automatiska kontrollprogram och gamla terminaler som lägger till poster i den här sql servern!Sv: Felsöka SQL datbas
Jag tror att ett alternativ till att använda triggers skulle vara Check Constraints på tabellerna. Dessa används just till att kontrollera data som läggs in i den aktuella tabellen.Sv: Felsöka SQL datbas
Stödjer SQL server dett?Sv: Felsöka SQL datbas
<Stödjer SQL server dett?
Ja, naturligtvis ;)
/mickeSv: Felsöka SQL datbas
http://www.databasejournal.com/features/mssql/article.php/2219901
http://www.aspfree.com/c/a/Database-Code/Constraints-In-Microsoft-SQL-SERVER-2000/7/Sv: Felsöka SQL datbas
Datat som inte "passar" constriansen nekas alltså att sättas in i databasen, men går det t.ex. något felmeddelande tillbaka till den applikation som försökte göra instättningen?Sv: Felsöka SQL datbas
DEFAULT
PRIMARY KEY
FOREIGN KEY
UNIQUE
CHECK
Dessa stödjs enligt ANSI standarden. Kolla i SQL BOL, efter syntaxen.
/mickeSv: Felsöka SQL datbas
Sv: Felsöka SQL datbas
DEFAULT, PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK innefattar (såvitt jag förstår det) constraines för intrevall på värden, se till att celler ej är null, se till att värdne är unika samt se till att realtioner mellan tables bibehålls.Sv: Felsöka SQL datbas
<constraines för intrevall på värden, se till att celler ej är null, se till att värdne är unika samt se till att <realtioner mellan tables bibehålls.
Detta täcker (enligt mig) in 99.99% av all data som finns, eller behövs kontrolleras.
Berätta vad du vill kolla, så kan vi visa dig hur det skall göras. Detaljerade frågor får detaljerade svar. Du har bara frågat OM det funkar. Ja är svaret :)
/mickeSv: Felsöka SQL datbas
Tyvärr har jag ingen möjlighet att ändra på applikationen som lägger till posten, då det ju är där man borde åtgärda det.Sv: Felsöka SQL datbas
<CODE>
datediff(day, DateAdd(Year, Age, BirthDate), EntryDate) >= 0
AND
datediff(day, DateAdd(Year, Age, BirthDate), EntryDate) < 365
</CODE>
Detta fungerar, men det kan bli randproblem vid skottår. Om man tycker att detta är ett problem, kan man bygga ut villkoren...
/Pelle