+ Start a Discussion
Neha TalyanNeha Talyan 

why do we need without sharing keyword ? when without specifying "Without sharing" keyword class still acts as without sharing by default ?

why do we need without sharing keyword ? when without specifying "Without sharing" keyword class still acts as without sharing by default ?
Thanks in advance.
Sohan Raj GuptaSohan Raj Gupta
Hi Neha,

Use the with sharing or without sharing keywords on a class to specify whether or not to enforce sharing rules.
The with sharing keyword allows you to specify that the sharing rules for the current user be taken into account for a class. You have to explicitly set this keyword for the class because Apex code runs in system context. In system context, Apex code has access to all objects and fields— object permissions, field-level security, sharing rules aren’t applied for the current user. This is to ensure that code won’t fail to run because of hidden fields or objects for a user. The only exceptions to this rule are Apex code that is executed with the executeAnonymous call and Chatter in Apex. executeAnonymous always executes using the full permissions of the current user.

Some things to note about sharing keywords:
  • The sharing setting of the class where the method is defined is applied, not of the class where the method is called. For example, if a method is defined in a class declared with with sharing is called by a class declared with without sharing, the method will execute with sharing rules enforced.
  • If a class isn’t declared as either with or without sharing, the current sharing rules remain in effect. This means that the class doesn’t enforce sharing rules except if it acquires sharing rules from another class. For example, if the class is called by another class that has sharing enforced, then sharing is enforced for the called class.
  • Both inner classes and outer classes can be declared as with sharing. The sharing setting applies to all code contained in the class, including initialization code, constructors, and methods.
  • Inner classes do not inherit the sharing setting from their container class.
  • Classes inherit this setting from a parent class when one class extends or implements another.
You can check complete guide at https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_keywords_sharing.htm


Hope this will help you. Let me know if it helped or you need any more assistance. 

Please mark this is as the solution if it solved your purpose.

Thanks,
Sohan Raj Gupta 
Ajay K DubediAjay K Dubedi
Hi Neha,

Use them without sharing keywords when declaring a class to ensure that the sharing rules for the current user are not enforced

for more info refer the below code, it will definitely help you.

http://sfdcfox.blogspot.com/2016/01/with-sharing-without-sharing-and-you.html

Thank You,
Ajay Dubedi