IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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.

Aktivity
Avatar
Karel Láska
Člen
Avatar
Karel Láska:11.5.2020 10:10

DB náhodně změní datový typ pole. (real -->nvarchar(4000))

Zkusil jsem: Je to spíše souhrn a uvedení do "obrazu"

DB je ve výrobním stroji.
K DB přistupují různé programy ("ProgramH", DB pro zobrazení v asp.net., HMI stroje)
"ProgramH" je můj kandidát, neb jediný má ve scriptech změnu, či znovuvytvoření tabulky.
Mohu změnit ProgramuH přihlašovací údaje, musím mu však ponechat právo měnit a zakládat tabulku.
Tabulka obsahuje cca 250 řádků a cca 200 sloupců.
Není často aktulizována, je to asi 3x za měsíc. Častěji se užívá pro čtení.

Chci docílit: Rád bych podložil vývojovému týmu programuH, že změna datového typu pochází od jejich přihlašovacích údajů.
Jde mi o to, udělat jakousi "pastičku" na změnu datového typu, případně i na změny obsahu.

 
Odpovědět
11.5.2020 10:10
Avatar
Jakub Švasta
Lektor
Avatar
Odpovídá na Karel Láska
Jakub Švasta:11.5.2020 12:30

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

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
11.5.2020 12:30
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:11.5.2020 12:32

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 :)

 
Nahoru Odpovědět
11.5.2020 12:32
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:11.5.2020 12:42

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.

 
Nahoru Odpovědět
11.5.2020 12:42
Avatar
Karel Láska
Člen
Avatar
Odpovídá na Jakub Švasta
Karel Láska:11.5.2020 15:39

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.

 
Nahoru Odpovědět
11.5.2020 15:39
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:11.5.2020 18:31

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.

 
Nahoru Odpovědět
11.5.2020 18:31
Avatar
Karel Láska
Člen
Avatar
Odpovídá na Peter Mlich
Karel Láska:12.5.2020 7:30

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ý.

 
Nahoru Odpovědět
12.5.2020 7:30
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:12.5.2020 7:42

:) 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.

 
Nahoru Odpovědět
12.5.2020 7:42
Avatar
Karel Láska
Člen
Avatar
Odpovídá na Peter Mlich
Karel Láska:12.5.2020 8:25

Č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.

 
Nahoru Odpovědět
12.5.2020 8:25
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:12.5.2020 10:15

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.

 
Nahoru Odpovědět
12.5.2020 10:15
Avatar
Odpovídá na Karel Láska
Michal Štěpánek:12.5.2020 15:50

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?

Nahoru Odpovědět
12.5.2020 15:50
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:12.5.2020 21:29

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.

 
Nahoru Odpovědět
12.5.2020 21:29
Avatar
Barbora Stojanová:13.5.2020 11:52

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.

 
Nahoru Odpovědět
13.5.2020 11:52
Avatar
Karel Láska
Člen
Avatar
Karel Láska:25.8.2020 13:06

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
 
Nahoru Odpovědět
25.8.2020 13:06
Avatar
Odpovídá na Karel Láska
don.jarducius:25.8.2020 22:30

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?

Nahoru Odpovědět
25.8.2020 22:30
Ten kdo nechce hledá důvod, ten kdo chce hledá způsob
Avatar
Karel Láska
Člen
Avatar
Odpovídá na don.jarducius
Karel Láska:27.8.2020 6:26

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ý...

 
Nahoru Odpovědět
27.8.2020 6:26
Avatar
Odpovídá na Karel Láska
don.jarducius:27.8.2020 6:40

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.

Nahoru Odpovědět
27.8.2020 6:40
Ten kdo nechce hledá důvod, ten kdo chce hledá způsob
Avatar
Karel Láska
Člen
Avatar
Odpovídá na don.jarducius
Karel Láska:27.8.2020 6:58

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...

 
Nahoru Odpovědět
27.8.2020 6:58
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 18 zpráv z 18.