How Can A Trigger Act Asynchronously To The Event That Fired It In Sql Server 2005?
Sep 12, 2007
if service broker is not an option, how can the trigger and sp(s) called by our trigger act asynchronously to the event that fired the trigger in the first place. We are more concerned with the original event being committed than the actions that follow via the trigger.
I'm trying to cath content of PRINT statements through InfoMessage event. I have subscribed on InfoMessage event through ConnectionEventsVt interface. The problem that event fired only once for statement. For example i have following T-SQL script:
Code Snippet
PRINT 'Message1' PRINT 'Message2' GO
PRINT 'Message3' PRINT 'Message4' GO
When i execute this script InfoMessage event fired twice. First time Error object Description property contains "Message1" text. Second time it contains "Message3" text.
What i'm doing wrong?
Server: MS SQL Sever 2005 OS: Windows XP SP2 IDE: Delphi 7
Are there any limitations or gotchas to updating the same table whichfired a trigger from within the trigger?Some example code below. Hmmm.... This example seems to be workingfine so it must be something with my specific schema/code. We'reworking on running a SQL trace but if anybody has any input, fireaway.Thanks!create table x(Id int,Account varchar(25),Info int)GOinsert into x values ( 1, 'Smith', 15);insert into x values ( 2, 'SmithX', 25);/* Update trigger tu_x for table x */create trigger tu_xon xfor updateasbegindeclare @TriggerRowCount intset @TriggerRowCount = @@ROWCOUNTif ( @TriggerRowCount = 0 )returnif ( @TriggerRowCount > 1 )beginraiserror( 'tu_x: @@ROWCOUNT[%d] Trigger does not handle @@ROWCOUNT[color=blue]> 1 !', 17, 127, @TriggerRowCount) with seterror, nowait[/color]returnendupdate xsetAccount = left( i.Account, 24) + 'X',Info = i.Infofrom deleted, inserted iwhere x.Account = left( deleted.Account, 24) + 'X'endupdate x set Account = 'Blair', Info = 999 where Account = 'Smith'
Hi, I have an Access frontend and an SQL Server backend. I use a Query (in Access frontend) to insert in two tables simultaneously. I have a trigger in one of the involved table which update the foreign key in another involved table. I've built an SQL View with exacly!!! the same syntax as my Query in Access. And when I insert a new entry through the SQL View the trigger fires(the foreign key is updated), but when I insert through my Access Query the trigger doesn't fires (the foreign key is not updated). Any idea ?
We have an asp web aplication using COM on a SQL Server 2000 database. The application uses COM to perform the database access. On altering data, the code checks the @@rowcount to see if the intented insert or update was succesfull - this is done on changes in various colums in various locations in the code. Now we need to add a trigger to update changed data into other tables. This is because we start migrating to a different data structure - while keeping most of the original code intact.
The problem is now, that the trigger beeing fired erases the @@rowcount. I can imagine others to have experienced the same problem. So, the big question is here:
Is there a solition/workaround to keep the @@rowcount on update/insert/deletes on a table evn if a trigger fires?
Thank you, Marco van Schagen, Crexx, the Netherlands
Hello. is there an event that exists for server level triggers when a database restore occurs? I don't see restore_database as an option in BOL... I DO see
CREATE_DATABASE
ALTER_DATABASE
DROP_DATABASE
Any way to fire a server trigger on a database restore?
We're capturing the other server events but would like to also log and be notified of database restores. Thanks, Bruce
Can anyone offer any advice. I was wondering whether MS SQL server offeredany facilities to trigger an event after a period of time had lapsed? e.g.once a week check data and if it is out of date email an related address.many thanks
Hi There, I have created a trigger which supposingly will do event before delete the record from its own table.unfortunately when i try delete the record to test it whether it will do the event (inserting some records to another table), i found that it was not doing the event like i wanted to be. :(the trigger is as below :=======================CREATE TRIGGER TG_D_AGENT ON dbo.AgentFOR DELETEASbegindeclare @vAgentID as numeric,@vAgency as varchar(50),@vUnit as varchar(50),@vAgentCode as varchar(50),@vName as varchar(50),@vIC as varchar(14),@vAddress as varchar(100),@vContactNumber as varchar(50),@vDownlink as varchar(50),@vGSM as varchar(10),@vAM as varchar(10),@vDeleted_date as datetime set @vDeleted_date = convert(datetime, convert(varchar(10) , getdate(),103),103)declare cur_policy_rec CURSOR forselect AgentID,Agency,Unit,AgentCode,[Name],IC,Address,ContactNumber,Downlink,GSM,AM from insertedopen cur_policy_recfetch from cur_policy_rec into @vAgentID,@vAgency,@vUnit,@vAgentCode,@vName,@vIC, @vAddress,@vContactNumber,@vDownlink,@vGSM,@vAM WHILE @@FETCH_STATUS=0BEGIN INSERT INTO [Agent_history] (AgentID,Agency,Unit,AgentCode,Name,IC,Address,Con tactNumber,Downlink,GSM,AM,Deleted_date) VALUES(@vAgentID,@vAgency,@vUnit,@vAgentCode,@vNam e,@vIC,@vAddress,@vContactNumber,@vDownlink,@vGSM, @vAM,@vDeleted_date)fetch from cur_policy_rec into @vAgentID,@vAgency,@vUnit,@vAgentCode,@vName,@vIC, @vAddress,@vContactNumber,@vDownlink,@vGSM,@vAM enddeallocate cur_policy_recend===============================in oracle , i normallly can do something like this...====================================CREATE TRIGGER TG_D_AGENT ON dbo.AgentBEFORE DELETE ON dbo.Agent FOR EACH ROWbeginIs that such thing function like 'BEFORE' in MS SQL SERVER 2000, coz in sql server im not sure they do have or not. Plz someone help me on this...realy appreciated if can!
I have created a trigger ON a table AFTER Insert, Update staement. In the trigger's body I am making a call to a stored procedure. In the procedure, I want to know the Trigger invoked due to which event : insert or Update as I have to handle bith the cases differently. But I am not able to find out any SQL server function or property which can distinguish between INSERT and Update events of a trigger.
I have created a trigger ON a table AFTER Insert, Update staement. In the trigger's body I am making a call to a stored procedure. In the procedure, I want to know the Trigger invoked due to which event : insert or Update as I have to handle bith the cases differently. But I am not able to find out any SQL server function or property which can distinguish between INSERT and Update events of a trigger.
Is this true that only one Person can query the Server at the same time? ( 1CAL Lizense)
I wrote a .Net Appllication and now the Appllication need acces to the Server to Query Tables. In the "Rush Hour" it is possible that more than 100 Person make Querys from that Application to the SQL Server at the same time.
I don´t understand the CAL Lizens because the SQLServer Express allows up to 20 connection!? The SQLExpress is for free and allow more connections than a paid Version? Or is a difference between connection ( through the Appllication) and Connection through the Management Studio ?
I just performed a fresh install of MSSQL 2005 Server Developer Edition on my XPSP2 machine along with MSSQL 2005 SP1 and I noticed that errors are not being reported in the Windows Event Viewer. Is there a way to enable/disable logging here?
I need to view these logs because when the tasks > 'copy database' task fails it submits its error in the Windows Event Log however since I reinstalled MSSQL 2005 these log entries don't appear here.
I have been trying to drill down to the cause for this event log message: "The configuration of the AdminConnectionTCP protocol in the SQL instance SQLEXPRESS is not valid." It is reported from the SQLBrowser service as a warning when the service starts. I have tried starting SQLBrowser.exe with -c flag, but the output reveals no errors. I have seen this error on three computers. Two are running SQL 2000, 2005 and Express. One was only running Express, but still this message. I then looked into the log for the SQL Express server itself. It shows this message on startup: "Dedicated administrator connection support was not started because it is not available on this edition of SQL Server. This is an informational message only. No user action is required." Now, it appears to me that these two messages may relate to the same "error" (or rather behaviour by design). So, can anyone confirm that the warning in the event log from the SQL Browser service occurs becuase of that the SQL Express edition doesn't allow any "AdminConnection", but the SQL Browser service isn't aware of that SQL Express edition shouldn't support that, and reports it as a warning (implying that we can't do much about this warning)?
I am calling a stored procedure (say X) and from that stored procedure (i mean X) i want to call another stored procedure (say Y)asynchoronoulsy. Once stored procedure X is completed then i want to return execution to main program. In background, Stored procedure Y will contiue his work. Please let me know how to do that using SQL Server 2000 and ASP.NET 2.
In my shared hosting environment where I am making large volumes of database calls, I am very anxious to preserve my heavily throttled threads-I presume when I make a database call, that it is going to a separate server and any threads that server may be using are in addition to my " hosting plan ". My question (s) is, is it therefore a no-brainer to always make calls to:Dim oResult As IAsyncResult = iDBCmd.BeginExecuteReader()arWaitHandles(0) = oResult.AsyncWaitHandleiIndex = WaitHandle.WaitAny(arWaitHandles, 60000, False) i.e. run all calls to the database asynchronously? Is it really releasing a thread back to my asp.net App while it is waiting? (I.e. Is it worth doing)
CREATE TRIGGER User_Insert ON aspnet_users AFTER UPDATE AS IF UPDATE (UserId) insert into users (aspnet_user_id, username) select au.userid, au.username from aspnet_users au where au.userid != users.aspnet_user_id;
Whenever the aspnet_users table has a new user added I want the Userid and username fields from that table inserted into the the aspnet_user_id and username fileds of the users table.
when creating the trigger I get the following error..
Msg 4104, Level 16, State 1, Procedure User_Insert, Line 3 The multi-part identifier "users.aspnet_user_id" could not be bound.
I'm having problems with a CLR Trigger trying to get it to work with SQL Server... and i believe it is because permissions... basicly i want to make my trigger get the name of a newly created database and then look for a table and then see if is empty... then add some rows... thats all...
I have set my databases as Trustworthy and also i have enabled the "clr enabled" parameter... i mark my project as "Safe" in the Project properties... and it still doesn't work... do i need to sign my project..? if so.. how?
i'm clueless...
Thank You.!
Code Block 'Table_1' table - Unable to create table. A .NET Framework error occurred during execution of user-defined routine or aggregate "Trigger1": System.Security.HostProtectionException: Attempted to perform an operation that was forbidden by the CLR host. The protected resources (only available with full trust) were: All The demanded resources were: UI System.Security.HostProtectionException: at System.Security.CodeAccessSecurityEngine.ThrowSecurityException(Assembly asm, PermissionSet granted, PermissionSet refused, RuntimeMethodHandle rmh, SecurityAction action, Object demand, IPermission permThatFailed) at System.Security.CodeAccessSecurityEngine.ThrowSecurityException(Object assemblyOrString, PermissionSet granted, PermissionSet refused, RuntimeMethodHandle rmh, SecurityAction action, Object demand, IPermission permThatFailed) at System.Security.CodeAccessSecurityEngine.CheckSetHelper(PermissionSet grants, PermissionSet refused, PermissionSet demands, RuntimeMethodHandle rmh, Object assemblyOrString, SecurityAction action, Boolean throwException) at System.Security.CodeAccessSecurityEngine.CheckSetHelper(CompressedStack cs, PermissionSet grants, PermissionSet refused, PermissionSet demands, RuntimeMethodHandle rmh, Assembly asm, SecurityAction action) at Triggers.Trigger1() . The statement has been terminated.
I have a lengthy stored procedure that does archiving that I'd just like to start and let it run, quickly returning control back to the ASP.net web page. To accomplish this my research shows that I should be passing the "adAsyncExecute" option but all of the examples I've been able to find don't jive with the way I execute stored procedures. Shown below is the code I'm using. How would I introduce "adAsyncExecute" ? public static int DoStoredProcedure(SqlConnection aConn, string procName, params SqlParameter[] theParams) { int retVal = 0; SqlCommand aComm = new SqlCommand(procName, aConn); aComm.CommandType = CommandType.StoredProcedure; foreach(SqlParameter aParam in theParams) { aComm.Parameters.Add(aParam); } SqlParameter returnValue = aComm.Parameters.Add("@ReturnValue", SqlDbType.Int); returnValue.Direction = ParameterDirection.ReturnValue; try { aConn.Open(); aComm.ExecuteNonQuery(); retVal = (int) returnValue.Value; } catch(Exception ex) { Debug.Fail("Error running SQL Query: " + ex.Message, "DBTools.DoStoredProcedure"); throw; } finally { aConn.Close(); } return retVal; }
By Database is heavily used , we use Transaction log backups ever 10 minuts, now someone fired a wrong query , that updated a particular table , the DB is still in use, there are some users working on it , I cant get the DB offline , what can I do to correct the mistake , please advice.
I'm working with ADO 2.8 en C++ with Visual Studio 2005. I want to perform a "select" in asynchronous mode. I don't really understand the logical of the recordset events. For example, I received a number of MoveComplete event higher than the number of rows in my recordset. It is really not clear for me ...
Does someone knows where I can find a a good example of C++ (or VB) code to manage select statements in asynchronous mode ?
I'm assuming it's possible to call a web service asynchronously from a SQL CLR function, is this correct or is there a fundamental flaw in calling the asynchronous methods?
I've tried coding a sample and despite creating a new thread, which in turn calls the web service asynchronously and using newthread.join I can never get the webmethodasync_completed sub to be called.
I was wondering when events inside IDTSComponentEvents interface are called when you throw a SSIS package? I've got a private class which implements IDTSEvents and along with that got another one that implements the IDTSComponentEvents. I see how neither of them are fired when I debug the code by using F11, and I don't know what is it for.
Let me know your comments or come back to me if you need further details on that.
When the database starts,I want to startup a trigger to do something,how can I do ? I know there are two kinds of trigger in SQL Server 2005 ,one is DML trigger and the another is DDL trigger Could you tell me ,Is there a trigger for database level in SQL Server 2005 ? I know there is this kind of trigger in oracle .
Hello,I have a form in a web application. When I submit the form it inserts the record into the SQL Server 2005 database. I have an insert trigger. My question is how can i debug the trigger? the trigger then calls a CLR based stored procedure, again how can i debug this CLR stored procedure which gets called by the trigger. Thanks...kindly advice.
hi actually i have a temporay table wich has four columns say col_1,col_2,col_3,col_4. so firstly i wud bulk insert from a text file wich mite contain thousands of rows. then from this temp table col_1 and col_2 shd go to master_a.wich has an identiy column as primary key. say id,col_1, col_2.
i will have another table detail_b where in there is a foreign key to the table master_a for id. so it will have f_id, col_3,col_4.
so i am riting a trigger on master_a. so whenver row is inserted in master_a. coresponding id and col 3 col4 shd be inserted into detail_b.
For this in oracle we have row level trigger. where in for each insertion in master a .. correspoding trigger will fire but in sql 2000.. but i wud like to implemtn row level trigger.. can u hlep me out..
Hello,I am learning SQL Server 2005.I need to create a trigger which increments number of book'spublications:CREATE TRIGGER InsertPublicationON PublicationsAFTER INSERTASBEGINSET NOCOUNT ON;DECLARE @Num smallintSET @Num = SELECT NumPublications FROM Books WHERE ISBN IN(SELECT ISBN FROM inserted);UPDATE BooksSET NumPublications = @Num + 1WHERE ISBN IN(SELECT ISBN FROM inserted);ENDUnfortunately I receive a message:Incorrect syntax near the keyword 'SELECT'.Could you explain me please how to correct the code?I am new to SQL Server.Thank you very much./RAM/
I simply need a trigger to delete some datasets from a view but have some trouble writing an adequate trigger. Here is my attempt:
Use myDB; Go CREATE TRIGGER IO_Trig_Del_myView ON myView INSTEAD OF Delete AS BEGIN SET NOCOUNT ON -- Check for dataset, if present delete. IF (EXISTS (SELECT Z.[myPk] FROM myTable t, deleted WHERE t.[myPk] = deleted.[myPk])) Delete From myTable Where myTable.[myPk] = deleted.[myPk]...
This causes the following failure:
Msg 4104, Level 16, State 1, Procedure IO_Trig_Del_myView, Line 11 The multi-part identifier "deleted.myPK" could not be bound.
Can somebody explain the reason to me? myPk is part of the View I created. Since I do have three tables in myView so I get that message three times, once per table.