Diskuze: MSSQL - Nežádaná změna datového typu pole z externího programu
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 18 zpráv z 18.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.
Zkusil bych vytvořit DDL trigger, který ti při každém CREATE, ALTER nebo DROP tabulky někam zaloguje informace o tom, co se stalo. Něco jako je popsáno tady
Tak cinnost toho programu loguj. Pozadavek prijde z te a te adresy, datum,
cas. Datovy typ se zmeni tehdy a tehdy. A bude podezrele, kdyz se budou ty casy
prekryvat. Tusim, sql ma moznost pridat k tabulce trigery a pak je mozne spustit
nejakou akci, kdyz se provadi insert nebo jiny prikaz.
https://www.itnetwork.cz/…-trigger-dml
Nechapu, proc by jsi mel dovolit externi app zasahovat do sql tabulky na
localhostu. Vzdycky se to dela pres pomocny program, ktery dostane pozadavek
(data) obvykle pres zip balicek xml/csv/json. Pokud to tva app udela spatne, je
to tvuj problem.
I update u eshopu se dela pomoci xml. Eshop vytvori post pozadavek na tvou app,
da ji data a porad si s tim, jak umis
Jako, uplne jednoduse to muzes sledovat tak, ze si das logovat requesty
serveru. A k tomu si spustis nejaky svuj programek, ktery treba, co 5 minut
udela test struktury tabulky. Zapises cas testu.
A pak neni problem z toho prvniho logu vytahnout vsechny, kteri neco delali v te
dobe s db.
A kdyz budes mit nekolik takovych balicku, tak muzes hledat spolecneho
uzivatele.
Ale, stejne mi neni jasne, proc si pustis do db externi program. Proc mu dovolis spoustet sql prikazy. At se prihlasi na tvou app a posila ji data. Tam si sql prikazy pohlidas.
Mouser: Zachytávač nastaven, díky za tip...
Peter Mlich : Na trigry nyní nastaveno. Jinak bohužel je to v korporátu, kde
je tento systém v několika továrnách po celém světě a není možnost
úpravy.
Každopádně zatím oběma díky.
Ja bych jim dal pristup do nejake fake tabulky. Takze ti do hlavni nebusou sahat a pak bude jen na tobe, abys zmeny zkopiroval i do sve.
Peter Mlich: Ano to bych mohl udělat. Musel bych mít nastavený trigger na insert, update a delete a v případě provedení bych musel data proklopit do oficiální tabulky.
Bohužel jsem včera díky trigrům zjistil nemilou věc.
Nejdřív na celé tabulce na všech polích (110) proběhne předefinování
typů.
např. (ALTER TABLE [Parameters] ALTER COLUMN PartNumber NVARCHAR(40))
Poté proběhne delete řádku a insert.
Pak se znovu provede předefinování typů a opět delete a insert. Opakuje se
pro všech 220 řádků...
Neskutečný.
To zalezi na tom, jak je
vymyslene. Ja treba mam program, formular, ke kteremu je v priloze tabulka
financi, scitani za jednotliva pracoviste, osy x, y, z, value. To proste nejde
ukladat jinak nez, ze celou tabulku smazes a inserty vlozis novou. Hodne jsem
premyslel o id policku, nakonec jsem ho zrusil, protoze by mi ho autoincrement
silene navysoval.
To, co delaji oni, se da udelat v jedne transakci. Mozna to tak delaji, mozna
ne.
Kazdopadne si porovnej casy s pristupy na server, jestli chces zjistit, kdo to
tam posila.
Jak jsem psal, ja bych je do db nepustil, jedine pres pomocny program, kde muzu
upravovat sql dotazy sam.
Časy jsem si porovnal i přístupy. Na naplnění tabulky proběhne 28 tisíc alter table (viz výše) proložených delete a insert.
Jinak moc díky.
Ještě to zvážím, mám tu cca 60 DB, a hlídat všechny je docela na...
Stalo se to nyní po měsíci na stejný DB. Pokud se bude opakovat, vydám se
jinou cestou.
Na smazani cele tabulky je prikaz TRUNCATE. Ale oni mozna meni jen nektere
radky, ne vsechny.
I tak bych sel cestou, ze to mas pod kontrolou a oni at se misto do db loguji do
tve app a posilaji data ve formatu csv, json nebo xml. Idealne jeste
zazipovane.
Jeste mne napadlo, ze by to mohl byt pozustatek nejake stare app. Ze to z
nejakeho duvodu nemuzou updatovat nebo nechteji, protoze update je placeny.
Pripadne mas na disku vice app a jednu z nich vyuziva ta firma pro update.
A neni mi jasne, pokud jde o celou tabulku, proc to soukaji insert po insertu,
kdyz se da napsat insert treba pro 1000 radku najednou. Ale, tak to by melo
vyznam pro kontrolu, ktery z radku neprosel updatem.
Trošku mě na tom zaráží, z jakého důvodu je vůbec umožněna změna struktury tabulky? Změnu dat v tabulce chápu, to je logické, ale změnu struktury?
Pravda, je mozne nastavit tomu uzivateli opravneni tak, ze strukturu menit nemuze. Teoreticky by ty ostatni dotazy mohli projit. Jen se to nebude dat provest jako jedna transakce, asi. Mozna nejak nastavit u transakce ignoraci chyb.
Ahoj, zapni Profiler, myslím, že bys ho měl mít nainstalovaný spolu se
studiem.
https://docs.microsoft.com/…ver-profiler?… . Jestli víš
v kolik se ty změny dělají, tak to zapni těsně předtím, vyjede ti spousta
informací ohledně změn a selectů do db. Nastavený to stačí mít viz
print. Nech zaškrtlý pouze tyhle dvě skupiny událostí a ty dva checkboxy
vpravo dole, dá se to pak ještě různě filtrovat, chvíli potrvá než se v
tom zorientuješ, ale je to supr nástroj. B.
Ahoj vespolek,
Rád bych se s vámi podělil o výsledek
Do DB jsem vložil triger dle rady Mousera. (kód níže)
Dlouho se nic nedělo, když znenadání opět stejná chyba.
Z logu jsem se dovtípil, že do jedné tabulky byly navázány 2 výstupy
různých dat (typů výroby)
A vzhledem k tomu že se tabulka aktualizuje vždy se změnou řádku a pouze
upravované hodnoty tak se změnilo pouze jedno pole.
Každopádně díky za pomoc
Karel
CREATE TRIGGER [alert_table2]
ON DATABASE
FOR CREATE_TABLE, DROP_TABLE, ALTER_TABLE
AS
BEGIN
INSERT INTO dbo.LogDML (SchemaName, TableName, TriggerName, LogTime, UserName, SPID, Delta)
SELECT '', '', '', GETDATE(), '','', EVENTDATA();
END
GO
ENABLE TRIGGER [alert_table2] ON DATABASE
GO
Tohle už by si ale zasloužilo posunout k výrobci toho SW ... resp.
zatrhnout programování tomu co to napsal a poslat ho k lopatě .
Nejen, že to je totálně neefektivní ale navíc to bude drasticky "zasírat"
log soubor k databázi.
PS: Ještě jsem neviděl takový soft co tohle dělá, prozradíš jméno toho zázračného softu?
No SW byl psán přímo pro korporát..
Nebudu lhát že napsaný to není ideálně, bohužel je za tím tým kdesi v
tramtárii.
A každá další úprava si žádá další peníze.
Na druhou stranu, byť je postaven na Oracle (tu moc jí nemusím ale to je osobní ), jde
spouštět ze serveru, export dat je do OPC serveru, MSSQL, FTP, Excelu a mnoho
dalších.
A není páky jej nahradit něčím jiným vzhledem k tomu kam je všude
provázán.
Nevím co myslíš že bude "zasírat" log. Ten script nahoře? Ten jsem použil pro diagnostiku chyby a nyní je vypnutý...
V případě MSSQL (ale budou to i další) je databáze rozdělená na 2
"bloky" - data a transakční log.
Dle nastavení recovery modelu databáze se zaznamenávají příkazy do
logu.
Úrovně jsou: Simple, Bulk-Logged a Full a dle těchto úrovní se loguje.
V čem je to napsané? V Javě? Ono totiž např. java i c# si s sebou nesou i zdrojové kódy a lze se k nim vcelku snadno dostat.
Nedošlo mi, že jsou příkazy ještě uložené v logu.
Každopádně z tohoto SW chodí dotazy minimálně. (změna provedení,
přidání nového). Počítám tak max 1 týdně..
Takže to asi nebudu řešit.
No díky za námět, ale rozhodně se v tom vrtat nechci, ať už je to
napsaný v čem chce
I kdyby se mi povedlo zdrojáky získat, stejně by mi byly k ničemu...
Zobrazeno 18 zpráv z 18.