I have an update trigger that does what it needs to do: update a datefield triggered by an after update trigger.
However, when I edit the contents of a table through SSMS (right-click - Edit top 200 rows) it gives me a message that the row couldn't be committed. The error:
The data in row x was not committed.
Eror message: The row value(s) updated or deleted either do not make the row unique or they alter multiple ows(2rows).
If i disable the trigger an update through the interface works just fine.
The same upate through an TSQL update statement works fine when the trigger is activated (and trigger does what it needs to do)
What is causing this behaviour and how can I have ànd the trigger ànd update through the interface?
Lots of my updates are queries that contain single quotes so it is easier to paste them than write an update statement to update them)
The issue is that triggers apparently just don't play nice when using the edit functionality
Related
I have a SQL Server table with database Trigger (Update) where sometimes a value is changed depending on the Update values. I know how to reflect changes if there a coumputed columns like setting "ValueGeneratedOnAddOrUpdate":
builder.Entity<PDBIntern.Models.PDB.Pfuscherakt>()
.Property(p => p.Aktenzahl)
.ValueGeneratedOnAddOrUpdate();
but if I set ValueGeneratedOnAddOrUpdate the generated Update statement exclude this column. How to reflect changes from Trigger and also include this coumn in the result (Select after Update)
Or is there a possibility to define the columns which EF generates after update statement to reflect changes in the table?
regards Robert
Your ef code does not know what your trigger has done. How could it?
Try refreshing your context before any operation eg. update
await dbContext.Entry(PDBIntern.Models.PDB.Pfuscherakt).ReloadAsync();
I want to trigger on all column changes on a table except a specific one, but listing all the columns in the AFTER INSERT OR UPDATE OF clause is a problem because the table has many columns and the set of columns changes at times, making maintaining the trigger definition in sync very error prone. How can I do this in a way that I just specify the column to omit from the trigger? For the moment I have an event trigger that prints a warning to update the trigger when that table is altered, but that relies on the user noticing the warning and obviously won't help when creating a new db.
I am trying to find a way so that when a specific column gets updated on a table that an update trigger (or maybe something else) can then select the stop number column from the same row that the datetime was update on. I want to capture the stop number and the column data before/after the update into another table. I do ok with SQL but I'm no expert so I just can't think of how to accomplish this.
Is it possible?
Yes, it is. Have a read through this. Basically there are two virtual tables, deleted and inserted, that you can query in a trigger. Deleted contains the row that is being deleted, and inserted (you guessed it) the row being inserted.
"How does that help? I'm doing an update." Indeed but an update is effectively a delete followed by an insert, so in an after update trigger you can get at the old value in deleted.
I am seeking suggestions on methods to trigger the running of code based on specific event occurring.
Basically I need to monitor all inserts into a table and compare a column value against a parameter set in another table.
For example, when a new record is added to the table and the column [Temperature] is greater than 30 (which is a value set in another table). Send an alert email to notify of this situation.
You can create a trigger (special type of stored procedure) that is automatically executed after an insert happened. Documentation for triggers is here: https://technet.microsoft.com/en-us/library/ms189799(v=sql.120).aspx
You will not be able to send an email out of SQL Database though.
Depending on how quick you need the notification after the insert, maybe you could make an insert into yet another table from within the trigger and query this new table periodically (e.g. using a script in Azure automation) and have the email logic outside the database.
I am using Postgres 9.3.
I just added a trigger to a table.
It is an after insert trigger which is executed for each row after each statement.
I coded the trigger function assuming the index of the same table contains the newly added rows.
If this is not true, mass inserts will slow down significantly.
I google it a bit but couldn't find an answer.
So, to sum up my questions is after a statement, is index updated before or after the "after insert trigger for each statement" in Postgres 9.3?
Here is the trigger definition I've used:
CREATE TRIGGER trigger_name
AFTER INSERT OR UPDATE
ON table_name
FOR EACH STATEMENT
EXECUTE PROCEDURE trigger_funtion();
An AFTER trigger FOR EACH ROW will see that row in the table. For that to happen reliably the row must have already been added to any indexes. So the index has been updated.
However, if you attempt to modify the table that caused the AFTER trigger to be fired within the AFTER trigger, this usually results in an infinite loop and an error. It is rarely the correct thing to do.
Usually when you're trying to do that, you actually want a BEFORE trigger that modifies the row before it is saved.
If you need to modify some other row in the same table, that often suggests a data model problem. You should very rarely, if ever, need to modify one row in a table using a trigger when a different row is modified.