3

I am trying to inactive Apex Trigger using tooling API. I don't see any errors, I am getting "Success" message, but Trigger is not getting updated with inactive flag.

String json= '{ "MetadataContainerId":"1dcS0000000fGp7IAE", "ContentEntityId": "01qS0000000YCKZIA4", "Metadata": { "status": "Inactive"} }';
Httprequest req =new HttpRequest();
req.setEndpoint(URL.getSalesforceBaseUrl().toExternalForm()+'/services/data/v43.0/tooling/sobjects/ApexTriggerMember/');
req.setHeader('Content-Type','application/json');
req.setHeader('Authorization','OAuth ' + UserInfo.getSessionId());
req.setMethod('POST');
req.setBody(json);
Http httpReq =new Http();
HttpResponse res = httpReq.send(req);
System.debug(res.getBody());

System.HttpRequest[Endpoint=https://yearup--Staging.my.salesforce.com/services/data/v43.0/tooling/sobjects/ApexTriggerMember/, Method=POST] System.HttpResponse[Status=Created, StatusCode=201] DEBUG|{"id":"401S0000000ANl3IAG","success":true,"errors":[],"warnings":[]}

// Create a Trigger
String json = '{ "Name" : "AccountTrigger", "TableEnumOrId" : "Account", "Body" : "trigger AccountTrigger1 on Account (before insert) { for(Account objacc : trigger.new){}}" }';
Httprequest req = new HttpRequest();
req.setEndpoint(URL.getSalesforceBaseUrl().toExternalForm() + '/services/data/v27.0/sobjects/ApexTrigger');
req.setMethod('POST');
req.setHeader('Content-Type', 'application/json');
req.setHeader('Authorization', 'OAuth ' + UserInfo.getSessionId());
req.setBody(json); 
Http httpReq = new Http();
HttpResponse res = httpReq.send(req);
System.debug(res.getBody());
// 01q54000000ShJ9AAK

// Create container
Httprequest req =new HttpRequest();
req.setEndpoint(URL.getSalesforceBaseUrl().toExternalForm()+'/services/data/v28.0/tooling/sobjects/MetadataContainer/');
req.setHeader('Content-Type','application/json');
req.setHeader('Authorization','OAuth ' + UserInfo.getSessionId());
req.setMethod('POST');
req.setBody('{"Name":"TriggerMContainer"}');
Http httpReq =new Http();
HttpResponse res = httpReq.send(req);
System.debug(res.getBody());
// 1dc54000000bs2bAAA

// Update Trigger
Httprequest req =new HttpRequest();
req.setEndpoint(URL.getSalesforceBaseUrl().toExternalForm()+'/services/data/v28.0/tooling/sobjects/ApexTriggerMember/');
req.setHeader('Content-Type','application/json');
req.setHeader('Authorization','OAuth ' + UserInfo.getSessionId());
req.setMethod('POST');
req.setBody('{"MetadataContainerId":"1dc54000000bs2bAAA","ContentEntityId" : "01q54000000ShJ9AAK", "Metadata": { "status": "Inactive"} }');
Http httpReq =new Http();
HttpResponse res = httpReq.send(req);
System.debug(res.getBody());


// Create Async
Httprequest req =new HttpRequest();
req.setEndpoint(URL.getSalesforceBaseUrl().toExternalForm()+'/services/data/v28.0/tooling/sobjects/ContainerAsyncRequest/');
req.setHeader('Content-Type','application/json');
req.setHeader('Authorization','OAuth ' + UserInfo.getSessionId());
req.setMethod('POST');
req.setBody('{"MetadataContainerId" : "1dc54000000bs2bAAA", "isCheckOnly": "false"}');
Http httpReq =new Http();
HttpResponse res = httpReq.send(req);
System.debug(res.getBody());
// 1dr54000001zhB4AAI

// Async Status
Httprequest req =new HttpRequest();
req.setEndpoint(URL.getSalesforceBaseUrl().toExternalForm()+'/services/data/v28.0/tooling/sobjects/ContainerAsyncRequest/1dr54000001zhB4AAI');
req.setHeader('Content-Type','application/json');
req.setHeader('Authorization','OAuth ' + UserInfo.getSessionId());
req.setMethod('GET');
Http httpReq =new Http();
HttpResponse res = httpReq.send(req);
System.debug(res.getBody());

Error:

enter image description here

0

Your request to update the ApexTriggerMember of this MetadataContainer succeeds, but that doesn't actually perform a deployment - it stages it in the container. The ApexTrigger Tooling API object itself does not support CRUD operations in an active org.

From the Tooling API documentation,

Use a MetadataContainer as a package for your tool’s workspace. As a user works in the tool, update the ApexClassMember, ApexTriggerMember, ApexPageMember and ApexComponentMember objects in the MetadataContainer and use a ContainerAsyncRequest object to save and deploy changes to the current organization.

You need to use a ContainerAsyncRequest to request a deployment of your container (by supplying its Id in the MetadataContainerId field).

  • Thank you, I am trying to creating ContainerAsyncRequest, however, I keep getting deployment error as attached screenshot. do you think, we need to contact support or it just that I am missing anything here? – Ajay Dec 11 '19 at 15:15
  • @Ajay Yeah, that's a gack. Nobody outside of Salesforce has the access to tell you exactly what it means. – David Reed Dec 11 '19 at 15:29
  • this is what I received from salesforce, "Unfortunately, this behavior is WAD per the current design of the tooling API. Our Product team has confirmed that this is a document BUG and the document needs to be updated." – Ajay Dec 12 '19 at 18:50
  • Oh interesting. Do you have a sense of what they're saying they'll update in the docs? – David Reed Dec 12 '19 at 19:27
  • I am also surprised, they gave me the link and said that they will be updating this document. developer.salesforce.com/docs/atlas.en-us.api_tooling.meta/…. Did you ever know about this? – Ajay Dec 12 '19 at 21:26

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.