SQL navazující triggery - jaký uživatel je spustí?

Vývojová prostředí, aplikace, skripty, http://www... síťové programy, internet, sdílení...
Odpovědět
dark_stuff
Začátečník
Začátečník
Uživatelský avatar
Registrován: 23. bře 2006
Bydliště: Bruntál / Olomouc

SQL navazující triggery - jaký uživatel je spustí?

Příspěvek od dark_stuff »

Mám tabulku TB1 a tabulku TB2. Na TB1 je after update trigger zapisující do TB2. User1 má právo na update TB1, ale nemá žádné právo na TB2. Jak se zachová databáze při UPDATE TB1, který volá User1? Spustí se trigger?
Lidi jsou různí. Víc nesmím říct.
Černá karta je rasistická!
Broxik
Začátečník
Začátečník
Uživatelský avatar
Registrován: 11. led 2010

Re: SQL navazující triggery - jaký uživatel je spustí?

Příspěvek od Broxik »

Jestli tvuj priklad spravne chapu melo by se stat to ze update se provede ael nasledna cinost z trigeru spadne na nedostatecnem opraveneni. Imo nez trige je lepsi dat update tabulky do transakce i s updatem tabulkou 2. A pokud se nepovede jedno z toho tak rollback. Tusim ten update v tabulce 2 tam nebude pro srandu kdyz je to tak psany.
Okurek!

Kód: Vybrat vše

U toho se nedá honit, kdyby si aspoň sundaly ty nitě z řiti.
chronograph
[/size]
dark_stuff
Začátečník
Začátečník
Uživatelský avatar
Registrován: 23. bře 2006
Bydliště: Bruntál / Olomouc

Re: SQL navazující triggery - jaký uživatel je spustí?

Příspěvek od dark_stuff »

Je to zjednodušený příklad reálného propojení dvou účetních systémů (každý se svou db), kdy do propojovací tabulky (TB1) má možnost zapisovat User1 a trigger made by User2 propisuje změny do TB2 (a triggery pověšené na TB2 potom do TB3, TB4...).
Podle všeho se server tváří, jako že trigger spouští User2 (tedy owner), protože kaskáda všech triggerů se provede.
Celé to vypadá, jako by se před triggerem automaticky vypisovalo execute as login=<owner>, nebo něco na ten způsob.
Dotaz jsem položil, protože jeden z triggerů volá systémovou fci na posílání mailů, která se neprovedla, pokud kaskádu triggerů vyvolal User1, protože oprávnění má na ni jen User2 a ona sama má na začátku execute as caller, tudíž se jí jiný user nedá podstrčit.

Prakticky jsem si odpověděl sám :-D. Jen je to dost neočekávané chování, u procedur nic takového jako automatické spuštění ownerem určitě nefunguje.

Pro kompletní info: MS SQL 2012
Lidi jsou různí. Víc nesmím říct.
Černá karta je rasistická!
Hermes
Nováček
Nováček
Registrován: 11. led 2016

Re: SQL navazující triggery - jaký uživatel je spustí?

Příspěvek od Hermes »

dark_stuff píše:Je to zjednodušený příklad reálného propojení dvou účetních systémů (každý se svou db), kdy do propojovací tabulky (TB1) má možnost zapisovat User1 a trigger made by User2 propisuje změny do TB2 (a triggery pověšené na TB2 potom do TB3, TB4...).
Podle všeho se server tváří, jako že trigger spouští User2 (tedy owner), protože kaskáda všech triggerů se provede.
Celé to vypadá, jako by se před triggerem automaticky vypisovalo execute as login=<owner>, nebo něco na ten způsob.
Dotaz jsem položil, protože jeden z triggerů volá systémovou fci na posílání mailů, která se neprovedla, pokud kaskádu triggerů vyvolal User1, protože oprávnění má na ni jen User2 a ona sama má na začátku execute as caller, tudíž se jí jiný user nedá podstrčit.

Prakticky jsem si odpověděl sám :-D. Jen je to dost neočekávané chování, u procedur nic takového jako automatické spuštění ownerem určitě nefunguje.

Pro kompletní info: MS SQL 2012
DML i DDL triggery jsou standardně spouštěny pod účtem volajícího, tedy toho, kdo provede příkaz, na který má trigger reagovat a to v případě, že není uvedeno jinak klauzulí EXECUTE AS.
Nutno však podotknout, že v MS SQL Serveru funguje bezpečnostní mechatnismus zvyký najko Ownerchip Chaining. Toto znamená, že pokud jeden programový objekt přistupuje k druhému (např. jedna procedura volá druhou) není testováno zabezpečení volajísího uživatele, pokud dva po sobě jdoucí programové objekty vlastní stejný uživatel.
Pro kontrolu oprávnění doporučuji v objektech použít funkce SUSER_SNAME(), USER_NAME() a dorazy na pohledy sys.login_token a sys.user_token.

Hodně zdaru
Odpovědět

Zpět na „Programování a web“