Keresés

Részletes keresés

larzen Creative Commons License 2004.10.01 0 0 55

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.

Előzmény: mma (53)
larzen Creative Commons License 2004.10.01 0 0 54

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

Előzmény: kolaloka (52)
mma Creative Commons License 2004.10.01 0 0 53

Bocs, egy kicsit más.

 

Downgrade-elnem kell SQL2000-ben írt triggereimet SQL7-re.

 

Van valakinek ötlete, mit lehet az instead of és after triggerekkel csinálni?

SQL7-ben csak for trigger van!

 

kolaloka Creative Commons License 2004.10.01 0 0 52
A legegyszerűbb (egy fölösleges sorral, de valószínűleg nem azon múlik):

create procedure csak as
declare @h2 int, @n int
begin tran
insert into tortenes (ido, ezred, fajta) values ('2004-12-23 12:12:12',2,3)
commit tran
go

tudsz küldeni egy egyszerű működő példát? Milyen ODBC verziót használsz? Én 3-ra állítom egy SQLSetEnvAttr hívással.
Előzmény: larzen (51)
larzen Creative Commons License 2004.09.30 0 0 51

Sikerült tárolt eljárást hívni, igaz nem C-ből, hanem VB-ből, de ugyanazt az ODBC-t használja mindkettő.

 

Hogy néz ki az a tárolt eljárás?

Előzmény: kolaloka (50)
kolaloka Creative Commons License 2004.09.29 0 0 50
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.

köszi: kolaloka
mma Creative Commons License 2004.08.05 0 0 49

Az id sorrend nem egyezik meg az order by sorrenddel. Egy-két helyen ugrás lesz.

pint Creative Commons License 2004.08.04 0 0 48
miért nem működik? mi a tünet?
Előzmény: mma (47)
mma Creative Commons License 2004.08.04 0 0 47

Kivételesen nem kérdezek, hanem egy tapasztalatomat osztanám meg veletek.

 

Egy lekérdezés eredménének a sorait szeretném sorrendben megszámozni.

A sorszámot az id nevű oszlopba akarm írni.

 

Elvileg ennek működnie kéne:

 

select 
    identity(int,1,1) id,
    field1,
    field2,
    field3

into #tmp
from 
    MYTABLE

order by
    field1,

    field2;

 

De ez sajnos hibázik.

 

A jó megoldás:

 

create table #tmp(

    id int identity,

    field1 int,

    field2 datetime,

    field3 varchar(20));

 

insert into  #tmp (
    field1,

    field2,

    fied3)
select 
    field1,
    field2,
    field3

from 
    MYTABLE

order by 
    field1,
    field2;

 

Nekem úgy tűnik, hogy ez jól működik.

 

Érdemes ezzel vigyázni!


 

mma Creative Commons License 2004.08.02 0 0 46

Jé, ez így működik!

Köszi szépen!

 

 

Előzmény: larzen (45)
larzen Creative Commons License 2004.08.02 0 0 45

gondolom ilyesmi:

 

CREATE trigger dbo.block_update_THistory
on dbo.THistory instead of UPDATE
as

 UPDATE dbo.THistory SET field01=inserted.field01, field02=inserted.field02, ...

  FROM inserted

  WHERE dbo.THistory.ID = inserted.ID and

 100*year(THistory.dt)+month(THistory.dt)>(select closed_month from TCONFIG)

 

megj.:

- update trigger esetén 2 virtuális tábla áll a rendelkezésedre: a deleted-ben vannak a módosított rekordok régi, az inserted-ben az új adatai.

- természetesen a SET utáni részt a mezőnevekkel kell módosítani

Előzmény: mma (44)
mma Creative Commons License 2004.08.02 0 0 44

Sziasztok!

 

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.

 

 

De hogy lehet vajon ilyet csinálni update-re?

 

Any suggestions would be greatly apprecited.

 

larzen Creative Commons License 2004.07.01 0 0 43

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.

Előzmény: HaAdam (42)
HaAdam Creative Commons License 2004.07.01 0 0 42

Tnx.

Nekem már csak egy olyan csoport kellene, mint a opszerveren az "all users", azaz az összes user jogát tudjam korlátozni.

Előzmény: larzen (41)
larzen Creative Commons License 2004.07.01 0 0 41

akkor a usereket tedd bele egy groupba (role) és annak szabályozd a jogosultságát.

a trigger nem erre való.

de ha már mindenképp triggerelni akarsz, akkor tegyél fel egy INSTEAD OF triggert, ami a módosítás helyett hajtódik végre.

HaAdam Creative Commons License 2004.07.01 0 0 40

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.

Ezért lenne jobb megoldás a trigger szerintem

 

Előzmény: Strasszer (39)
Strasszer Creative Commons License 2004.07.01 0 0 39
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.
Előzmény: HaAdam (38)
HaAdam Creative Commons License 2004.07.01 0 0 38

Lehet, hogy nem ide kellene írnom a kérdést...

 

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)

 

mma Creative Commons License 2004.05.26 0 0 37
Sziasztok!

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.

Hogy lehet ezt megcsinálni?

_paha_ Creative Commons License 2004.05.19 0 0 36
közben rájöttem az osql-es megoldásra:

backup:

OSQL -S sql_server_name -U sa -P sa_password -Q "backup database your_database_name TO DISK='c:\backup_folder\your_database_backup.bak'"

restore:

OSQL -S sql_server_name -U sa -P sa_password -Q "restore database your_database_name FROM DISK='c:\backup_folder\your_database_backup.bak'"

Előzmény: Ablakos indián (34)
_paha_ Creative Commons License 2004.05.19 0 0 35
bcp-vel eljutottam oda, hogy 1 táblát le tudok menteni. nade mindet?

Előzmény: Ablakos indián (34)
Ablakos indián Creative Commons License 2004.05.19 0 0 34
bcp.exe (Bulk Copy)

vagy osql.exe, ami futtat SQL scripteket.

Előzmény: _paha_ (33)
_paha_ Creative Commons License 2004.05.19 0 0 33
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?

Strasszer Creative Commons License 2004.01.29 0 0 32
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.
Előzmény: blackman (31)
blackman Creative Commons License 2004.01.29 0 0 31
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.
Előzmény: Strasszer (30)
Strasszer Creative Commons License 2004.01.28 0 0 30
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.
Előzmény: blackman (29)
blackman Creative Commons License 2004.01.28 0 0 29
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?

Koszi,
S.

Strasszer Creative Commons License 2004.01.28 0 0 28
Kérdezz. valaki biztos jár errefelé is.
Előzmény: blackman (27)
blackman Creative Commons License 2004.01.27 0 0 27
mielott barmit kerdeznek:
jar erre valaki neha?!?
Vagy mindenki oracle-ben nyomul?
Grones Creative Commons License 2003.06.20 0 0 26
Mar nem aktualis, talaltunk ra embert.
Előzmény: Bandixsystem (25)

Ha kedveled azért, ha nem azért nyomj egy lájkot a Fórumért!