sql >> Database >  >> RDS >> Sqlserver

Is het mogelijk om definitief vast te stellen of een DML-commando is uitgegeven vanuit een opgeslagen procedure?

Gebruik CONTEXT_INFO (Transact-SQL) . Stel in de procedure een waarde in om de trigger te waarschuwen om niets op te nemen:

--in the procedure doing the insert/update/delete

DECLARE @CONTEXT_INFO  varbinary(128)
SET @CONTEXT_INFO =cast('SkipTrigger=Y'+REPLICATE(' ',128) as varbinary(128))
SET CONTEXT_INFO @CONTEXT_INFO

--do insert/update/delete that will fire the trigger

SET CONTEXT_INFO 0x0 

Controleer CONTEXT_INFO in de trigger en bepaal of u iets moet doen:

--here is the portion of the trigger to retrieve the value:

IF CAST(CONTEXT_INFO() AS VARCHAR(128))='SkipTrigger=Y'
BEGIN
    --log your data here
END

voor iedereen die gewoon een frauduleuze insert/update/delete doet, zal de CONTEXT_INFO niet zijn ingesteld en de trigger zal de wijziging opnemen. U kunt zich verbeelden met de waarde die u in CONTEXT_INFO invoert, zoals de tabelnaam of @@SPID, enz., als u denkt dat de frauduleuze code ook zal proberen CONTEXT_INFO te gebruiken.



  1. VB.NET:de type-initialisatie voor 'MySql.Data.MySqlClient.Replication.ReplicationManager' veroorzaakte een uitzondering

  2. Hoe Visual Foxpro-database naar SQL Server-database te converteren

  3. Hoe weet ik of Autovacuum van PostgreSQL op UNIX draait?

  4. Python mysql (met pymysql) automatisch opnieuw verbinden