A FOR trigger az az AFTER trigger ("AFTER is the default, if FOR is the only keyword specified.")
Az INSTEAD OF problémához sok sikert kívánok... :) Egy ötlet: A trigger futásakor a törölt (módosított) sorok benne vannak a "deleted" virtuális táblában, míg az új (módosult) sorok az "inserted"-ben. Na, szükség esetén írd vissza az új adatokat a régire. Ez akkor működik, ha a trigger a módosítás után fut le (ez valószínű, hiszen ez after trigger), illetve ha ez a visszamódosítás nem eredményez új trigger indulást. Szerintem nem.
a tranzakcióban csak egy sor van? akkor miért van szükség az insert tranzakcióba foglaláshoz? vagy sikerül vagy nem. nem? :) fele nem fog végrehajtódni.
és milyen isolation level van beállítva? ha valahol a programod lockolja a táblát, és az isolation level pl. serializable, akkor a programod elakad és a táblát nem tudod megnyitni, míg le nem lövöd a programot (illetve amíg meg nem szűnik a lockolása). mondjuk azt nem tudom, hogy a végrehajtás akkor miért jelent sikert. a c++-s függvényeket nem ismerem.
én 2000-es servert használok, az pedig az msdn szerint "The SQL Server 2000 ODBC driver complies with the ODBC 3.51 specification."
M$ SQL Server 2000, Visual C++ 6.0 alatt kínlódom.
Sikerült már valamelyikőtöknek tárolt SQL eljárásokat ODBC-ből hívni? SQLExecDirecttel mindenféle mondat szépen lefut, de akár az ajánlott
{call eljarasnev(?,...)}
formában (SQLBindParameter persze), akár
exec eljarasnev parameter,...
formában az SQLExecDirect sikert jelez, ám semmi nem történik azon kívül, hogy az érintett táblákat foglalva tartja (az Enterprise Managerrel nem tudok beléjük nézni) amíg le nem lövöm az alkalmazást. Utána semmi változás a táblákban. Az eljárást kézzel futtatva semmi gond.
Havi zárást szeretnék úgy megoldani, hogy alkalmas triggerek ne engedjenek adott dátumnál régebbi rekordokat módosítani.
Törlés kivédésére jó pl. egy ilyen trigger:
CREATE trigger dbo.block_delete_THistory on dbo.THistory instead of DELETE as delete THistory from THistory inner join deleted on THistory.id = deleted.id where 100*year(THistory.dt)+month(THistory.dt)>(select closed_month from TCONFIG)
Ez a trigger a THistory táblából csak a TCONFIG.closed_month-nál újabb dt-jű rekordokat engedi törölni, működik is szépen.
az összes usert nem tudod lekorlátozni, mert a dbo standard role jogai nem módosíthatók.
ettől eltekintve működik az, amit gondolsz
hozz létre egy role-t az adatbázisban. nevezzük ezt most pl "myrole"-nak
ehhez rendeld hozzá azokat a jogosultságokat, amiket szeretnél engedélyezni (permission gomb a myrole adatlapján). Ezt egyszer kell megcsinálnod.
Utána az összes usert, akit beengedsz az adatbázisba, a public role mellett a most létrehozott myrole-hoz is rendeld hozzá (a public-hoz muszáj), és ezzel olyan jogai lesznek, amit te beállítottál a myrole-nak. ha a myrole-t változtatod, akkor az összes user jogosultsága változik. egyetlen különbség az általad kívánt "all users"-sel szemben, hogy ebbe a role-ba bele kell venni a usert, amikor beengeded az adatbázisba.
A megoldás jó is lenne, de nekem az összes userre kellene ezt alkalmaznom, ami elég macerás lehet, ha pl. valaki létrehoz egy új usert, és erre nem figyel.
szvsz nem trigger. EntMan-ban rámész a táblára, jobb gomb, tulajdonságok. ott prmissions gomb. erre előjön egy ablak, ott látod, kiknek van joguk a táblára. alul van egy columns gomb. arra klikk, és ott oszlopokra megadhatod, hogy ki milyen műveletet végezhet rajta. Remélem erre gondoltál.
Egy táblában akarom letiltani, hogy bizonyos mezöket modosíthasson akárki is.
Tehát felveszi a rekordot, és a védett mezö értéke a rekord törléséig nem szabad hogy változzon!
Ha jól sejtem Triggerrel kellene megoldani, csak nem tudom a parancsot megfogalmazni SQL-ben (sajnos sokat progiztam Pascalban, VB-ben és a halmazelvü programozás távol áll még tölem)
ADODB-vel és MSSQL-200 serverrel kapcsolatos kérdésem lenne. (A Visual Basic topikban már feltettem ezt a kérdést, de nem jött rá válasz, hátha itt igen.)
Tulajdonképpen csak annyi, hogy ha egy táblán valaki épp egy commitálatlan update-et hajt végre, akkor egy másik felhasználó hogy tudja azt a táblát közben egy ADODB.recordsetbe beolvasni.
A MSSQL Query Analizerből ez a következőképpen megy:
Nyitok két connectiont, két különbző taskban.
Mindkét ablakban kiadom a SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED parancsot.
Ezután az egyik ablakban a Begin transaction és update parancsokat adom ki (se commitot, se rollbackot még nem).
Ekkor a másik alakban vidáman látom a még commitálatlan módosításokat is.
Ezt az Quer Analizer / ADODB.recordset párossal a következőképpen próbáltam:
Adodb.connection.IsolationLevel = adXactReadUncommitted -et állítottam be,
az adodb.recordset-ben .LockType = adLockReadOnly-t.
A Query anaizerben: set TRANSACTION ISOLATION LEVEL READ UNCOMMITTED.
At vártam, hogy ekkor tudok az illető Adodb.connection-oz tartozó recordsetbe olvasni akkor is ha közben a Query Analizerben ott a comitálatlan update, de nem megy. A recordset addig nem hajtja végre az .open parancsot, amíg a Query Analizerben le nem zárom a tranzakciót.
azt mondja meg valaki, hogy mssql-ben van-e valami parancssoros utility adatbázis mentésre/visszatöltésre? mint a mysqlbackup, a pg_dump, az exp80 és társai?
szerintem két dolog közül választhatsz.
1. elkezdesz próbálkozni mindenféle más megoldásokkal, ettől vélhetően ideges leszel...
2. beszélsz a nagyon fontoskodó rendszergazdával, hogy van egy feladatod, amit _el_kell_végezned_ , és ehhez kellene egy kis támogatás az ő részéről. aztán ha még mindig fontoskodik, akkor gondolom van neki egy főnöke, meg van neked is egy megbizod, játszák le egymás között, hogy tudd a dolgodat végezni.
+1: próbáld meg a bakup file helyére beirni a saját gépedet. hátha megeszi.
igen, jol latod, eddig ezen a modon tudtam csinalni, hogy a backup file helye "\\gepnev\d$\backup..." formaban volt megadva.
Hat igen, a dbadminokkal az a baj, hogy ez egy nagyon nagy ceg, es teljesen hanyatt vannak esve a sajat fontossaguktol, vagyis szamukra egy fejleszto az csak valami szukseges rossz, egy kis zummogo szunyog.
hesss-hesss..
En meg nem nagyon csipem ha ilyen gagyi rutinfeladatokra ugy csinal valaki mintha a bolcsek kovet orizne, es erezzem magam megtisztelve.
Nem korrekt.
Vagy mindig a morcos homloku rendszergazdaknal kell ilyen trivialis dologert kuncsorogni? szvsz talán ez az egyszerűbb út. Bár úgy emlékszem, a backup esetén fel lehet venni helyeket, ahova ki lehet menteni az ab-t, bár ezt még nem próbáltam. próbáld meg a kliens-géped egyik share-jét oda felvenni, hátha sikerül.
Kosz.
Nos hat a kerdesem az lenne, hogy:
adatbazis mentest az ugyfel cegnel eddig enterprise managerben tudtam csinalni (backup database). A kapott file-t a fejlesztoi gepen 'restore', es maris ugyanazt az adatbazist latom, amit az eles rendszerben.
De most megkonfigoltak az eles adatbazist, ezert ez a modszer nem mukodik, csak a szerver particioira tudok dumpot csinalni, az meg nem jo, mert a gephez nekem feljesztonek nincs hozzaferese.
Kerdes az hogy lehet-e kliens oldalon valamilyen segedeszkozzel, eljarassal "backup/restore" kompatibilis allomanyt krealni?
(db_owner jogom meg van a tablakhoz)
Vagy mindig a morcos homloku rendszergazdaknal kell ilyen trivialis dologert kuncsorogni?