{"id":3666,"date":"2023-11-30T18:44:20","date_gmt":"2023-11-30T10:44:20","guid":{"rendered":"http:\/\/www.ponybai.com\/?p=3666"},"modified":"2023-11-21T19:02:28","modified_gmt":"2023-11-21T11:02:28","slug":"apex%e5%ae%89%e5%85%a8","status":"publish","type":"post","link":"http:\/\/www.ponybai.com\/?p=3666","title":{"rendered":"Apex Security \u548c \u5171\u4eab"},"content":{"rendered":"\n<p>\u5f53\u60a8\u4f7f\u7528 Apex \u65f6\uff0c \u4ee3\u7801\u7684\u5b89\u5168\u6027\u81f3\u5173\u91cd\u8981\u3002\u60a8\u9700\u8981\u4e3a Apex \u7c7b\u6dfb\u52a0\u7528\u6237\u6743\u9650\u5e76\u5f3a\u5236\u6267\u884c \u5171\u4eab\u89c4\u5219\u3002\u8bf7\u7ee7\u7eed\u9605\u8bfb\uff0c\u4e86\u89e3 Apex \u6258\u7ba1\u5171\u4eab\u548c \u83b7\u53d6\u4e00\u4e9b\u5b89\u5168\u63d0\u793a\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u5f3a\u5236\u6267\u884c\u5171\u4eab\u89c4\u5219<\/strong><\/li>\n\n\n\n<li><strong>\u5f3a\u5236\u6267\u884c\u5bf9\u8c61\u548c\u5b57\u6bb5\u6743\u9650<\/strong><\/li>\n\n\n\n<li><strong>\u5bf9\u6570\u636e\u5e93\u64cd\u4f5c<\/strong><br>\u5f3a\u5236\u5b9e\u65bd\u7528\u6237\u6a21\u5f0f \u901a\u8fc7\u4f7f\u7528\u5e26\u6709\u7279\u6b8a\u5173\u952e\u5b57\u7684 SOQL \u6216 SOSL \u67e5\u8be2\uff0c\u6216\u8005\u4f7f\u7528 DML \u65b9\u6cd5\u91cd\u8f7d\uff0c\u53ef\u4ee5\u5728\u7528\u6237\u6a21\u5f0f\u4e0b\u8fd0\u884c\u6570\u636e\u5e93\u64cd\u4f5c\uff0c\u800c\u4e0d\u662f\u5728\u9ed8\u8ba4\u7cfb\u7edf\u6a21\u5f0f\u4e0b\u8fd0\u884c\u6570\u636e\u5e93\u64cd\u4f5c\u3002<\/li>\n\n\n\n<li>\u4f7f\u7528&nbsp;<strong>stripInaccessible \u65b9\u6cd5\u5f3a\u5236\u5b9e\u65bd\u5b89\u5168\u6027 \u4f7f\u7528\u8be5\u65b9\u6cd5<\/strong><br>\u5f3a\u5236\u5b9e\u65bd\u5b57\u6bb5\u7ea7\u548c\u5bf9\u8c61\u7ea7\u6570\u636e\u4fdd\u62a4\u3002\u6b64\u65b9\u6cd5\u53ef\u7528\u4e8e\u4ece\u7528\u6237\u65e0\u6cd5\u8bbf\u95ee\u7684\u67e5\u8be2\u548c\u5b50\u67e5\u8be2\u7ed3\u679c\u4e2d\u5220\u9664\u5b57\u6bb5\u548c\u5173\u7cfb\u5b57\u6bb5\u3002\u8be5\u65b9\u6cd5\u8fd8\u53ef\u7528\u4e8e\u5728 DML \u64cd\u4f5c\u4e4b\u524d\u5220\u9664\u65e0\u6cd5\u8bbf\u95ee\u7684 sObject \u5b57\u6bb5\uff0c\u4ee5\u907f\u514d\u5f02\u5e38\uff0c\u5e76\u6e05\u7406\u5df2\u4ece\u4e0d\u53d7\u4fe1\u4efb\u7684\u6e90\u53cd\u5e8f\u5217\u5316\u7684 sObject\u3002<samp>stripInaccessible<\/samp><\/li>\n\n\n\n<li>\u4f7f\u7528&nbsp;<strong>WITH \u7b5b\u9009 SOQL<\/strong>&nbsp;\u67e5\u8be2<br>SECURITY_ENFORCED \u4f7f\u7528\u8be5\u5b50\u53e5\u53ef\u4ee5\u5bf9 Apex \u4ee3\u7801\u4e2d\u7684\u67e5\u8be2\uff08\u5305\u62ec\u5b50\u67e5\u8be2\u548c\u8de8\u5bf9\u8c61\u5173\u7cfb\uff09\u542f\u7528\u5b57\u6bb5\u7ea7\u548c\u5bf9\u8c61\u7ea7\u5b89\u5168\u6743\u9650\u68c0\u67e5\u3002<samp>WITH SECURITY_ENFORCEDSOQL SELECT<\/samp><\/li>\n\n\n\n<li><strong>\u7c7b\u5b89\u5168\u6027<\/strong><\/li>\n\n\n\n<li><strong>\u4e86\u89e3 Apex \u6258\u7ba1\u5171\u4eab \u5171\u4eab<\/strong><br>\u662f\u6388\u4e88\u7528\u6237\u6216\u7528\u6237\u7ec4\u5bf9\u8bb0\u5f55\u6216\u4e00\u7ec4\u8bb0\u5f55\u6267\u884c\u4e00\u7ec4\u64cd\u4f5c\u7684\u6743\u9650\u7684\u884c\u4e3a\u3002\u53ef\u4ee5\u4f7f\u7528 Salesforce \u7528\u6237\u754c\u9762\u548c Lightning Platform \u6388\u4e88\u5171\u4eab\u8bbf\u95ee\u6743\u9650\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528 Apex \u4ee5\u7f16\u7a0b\u65b9\u5f0f\u6388\u4e88\u5171\u4eab\u8bbf\u95ee\u6743\u9650\u3002<\/li>\n\n\n\n<li><strong>Apex \u548c Visualforce \u5f00\u53d1\u7684\u5b89\u5168\u63d0\u793a<\/strong><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u5f3a\u5236\u6267\u884c\u5171\u4eab\u89c4\u5219<\/h2>\n\n\n\n<p>Apex \u901a\u5e38\u5728\u7cfb\u7edf\u4e0a\u4e0b\u6587\u4e2d\u8fd0\u884c;\u5373\u5f53\u524d\u7528\u6237\u7684\u6743\u9650\u548c \u5728\u4ee3\u7801\u6267\u884c\u8fc7\u7a0b\u4e2d\u4e0d\u8003\u8651\u5b57\u6bb5\u7ea7\u5b89\u5168\u6027\u3002\u5171\u4eab\u89c4\u5219\uff0c \u4f46\u662f\uff0c\u5e76\u4e0d\u603b\u662f\u88ab\u7ed5\u8fc7\uff1a\u5fc5\u987b\u4f7f\u7528\u5173\u952e\u5b57\u58f0\u660e\u7c7b\uff0c\u4ee5\u786e\u4fdd\u5171\u4eab \u4e0d\u5f3a\u5236\u6267\u884c\u89c4\u5219\u3002<samp>without sharing<\/samp><\/p>\n\n\n\n<p>\u6ce8\u610f<\/p>\n\n\n\n<p>\u901a\u8fc7\u8c03\u7528\u6267\u884c\u7684 Apex \u4ee3\u7801\u548c Apex \u4e2d\u7684 Connect \u59cb\u7ec8\u6267\u884c \u4f7f\u7528\u5f53\u524d\u7528\u6237\u7684\u5171\u4eab\u89c4\u5219\u3002\u6709\u5173 \u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605\u533f\u540d\u5757\u3002<samp>executeAnonymousexecuteAnonymous<\/samp><\/p>\n\n\n\n<p>Apex \u5f00\u53d1\u4eba\u5458\u5fc5\u987b\u6ce8\u610f\u4e0d\u8981\u65e0\u610f\u4e2d\u66b4\u9732\u654f\u611f\u6570\u636e\uff0c\u800c\u8fd9\u4e9b\u6570\u636e\u901a\u5e38\u4f1a\u66b4\u9732 \u901a\u8fc7\u7528\u6237\u6743\u9650\u3001\u5b57\u6bb5\u7ea7\u5b89\u5168\u6027\u6216\u7ec4\u7ec7\u8303\u56f4\u7684\u9ed8\u8ba4\u503c\u5bf9\u7528\u6237\u9690\u85cf\u3002 \u4ed6\u4eec\u5fc5\u987b\u7279\u522b\u5c0f\u5fc3 Web \u670d\u52a1\uff0c\u8fd9\u4e9b\u670d\u52a1\u53ef\u80fd\u4f1a\u53d7\u5230\u6743\u9650\u7684\u9650\u5236\u3002 \u4f46\u662f\uff0c\u4e00\u65e6\u542f\u52a8\uff0c\u5c31\u8981\u5728\u7cfb\u7edf\u4e0a\u4e0b\u6587\u4e2d\u6267\u884c\u3002<\/p>\n\n\n\n<p>\u5927\u591a\u6570\u60c5\u51b5\u4e0b\uff0c\u7cfb\u7edf\u4e0a\u4e0b\u6587\u4e3a\u7cfb\u7edf\u7ea7\u64cd\u4f5c\u63d0\u4f9b\u6b63\u786e\u7684\u884c\u4e3a \u4f8b\u5982\u9700\u8981\u8bbf\u95ee\u7ec4\u7ec7\u4e2d\u6240\u6709\u6570\u636e\u7684\u89e6\u53d1\u5668\u548c Web \u670d\u52a1\u3002\u7136\u800c \u60a8\u8fd8\u53ef\u4ee5\u6307\u5b9a\u7279\u5b9a\u7684 Apex \u7c7b\u5e94\u5f3a\u5236\u6267\u884c\u9002\u7528\u7684\u5171\u4eab\u89c4\u5219 \u5230\u5f53\u524d\u7528\u6237\u3002<\/p>\n\n\n\n<p>\u6ce8\u610f<\/p>\n\n\n\n<p>\u4f7f\u7528\u5173\u952e\u5b57\u5f3a\u5236\u6267\u884c\u5171\u4eab\u89c4\u5219\u4e0d\u4f1a\u5f3a\u5236\u6267\u884c\u7528\u6237\u7684\u6743\u9650\u548c\u5b57\u6bb5\u7ea7\u5b89\u5168\u6027\u3002Apex \u603b\u662f\u6709 \u8bbf\u95ee\u7ec4\u7ec7\u4e2d\u7684\u6240\u6709\u5b57\u6bb5\u548c\u5bf9\u8c61\uff0c\u786e\u4fdd\u4ee3\u7801\u4e0d\u4f1a\u8fd0\u884c\u5931\u8d25 \u56e0\u4e3a\u5b57\u6bb5\u6216\u5bf9\u8c61\u5bf9\u7528\u6237\u9690\u85cf\u3002<samp>with sharing<\/samp><\/p>\n\n\n\n<p>\u6b64\u793a\u4f8b\u6709\u4e24\u4e2a\u7c7b\uff0c\u7b2c\u4e00\u4e2a\u7c7b \uff08\uff09 \u5f3a\u5236\u6267\u884c\u5171\u4eab\u89c4\u5219\uff0c\u800c\u7b2c\u4e8c\u4e2a\u7c7b \uff08\uff09 \u5219\u4e0d\u5f3a\u5236\u6267\u884c\u3002\u8be5\u7c7b\u4ece\u7b2c\u4e00\u4e2a\u65b9\u6cd5\u8c03\u7528\u4e00\u4e2a\u65b9\u6cd5\uff0c\u8be5\u65b9\u6cd5\u5728\u5f3a\u5236\u6267\u884c\u5171\u4eab\u89c4\u5219\u7684\u60c5\u51b5\u4e0b\u8fd0\u884c\u3002\u8be5\u7c7b\u5305\u542b\u4e00\u4e2a\u5185\u90e8\u7c7b\uff0c\u5176\u4e2d\u4ee3\u7801 \u5728\u4e0e\u8c03\u7528\u65b9\u76f8\u540c\u7684\u5171\u4eab\u4e0a\u4e0b\u6587\u4e0b\u6267\u884c\u3002\u5b83\u8fd8\u5305\u542b\u4e00\u4e2a\u6269\u5c55\u7684\u7c7b \u5b83\uff0c\u5b83\u7ee7\u627f\u4e86\u5b83\u7684\u65e0\u5171\u4eab\u8bbe\u7f6e\u3002<samp>CWith<\/samp><samp>CWithout<\/samp><samp>CWithout<\/samp><samp>CWithout<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public with sharing class CWith {\n  \/\/ All code in this class operates with enforced sharing rules.\n\n  Account a = &#91;SELECT . . . ];\n\n  public static void m() { . . . }\n  \n  static {\n    . . .\n  }\n\n  {\n    . . .\n  }\n\n  public void c() {\n    . . .\n  } \n}\n\npublic without sharing class CWithout {\n  \/\/ All code in this class ignores sharing rules and operates \n  \/\/ as if the context user has the Modify All Data permission.\n  Account a = &#91;SELECT . . . ];\n  . . .\n\n  public static void m() {  \n     . . . \n\n    \/\/ This call into CWith operates with enforced sharing rules\n    \/\/ for the context user. When the call finishes, the code execution \n    \/\/ returns to without sharing mode.\n    CWith.m();\n  }\n\n\n  public class CInner {\n    \/\/ All code in this class executes with the same sharing context\n    \/\/ as the code that calls it. \n    \/\/ Inner classes are separate from outer classes.\n    . . .\n\n    \/\/ Again, this call into CWith operates with enforced sharing rules\n    \/\/ for the context user, regardless of the class that initially called this inner class.\n    \/\/ When the call finishes, the code execution returns to the sharing mode that was used to call this inner class.\n    CWith.m();\n  }\n\n  public class CInnerWithOut extends CWithout {\n    \/\/ All code in this class ignores sharing rules because\n    \/\/ this class extends a parent class that ignores sharing rules.\n  }\n}<\/code><\/pre>\n\n\n\n<p>\u8b66\u544a<\/p>\n\n\n\n<p>\u56e0\u4e3a\u58f0\u660e\u4e3a \u7684\u7c7b\u53ef\u4ee5\u8c03\u7528\u58f0\u660e\u4e3a \u7684\u7c7b\uff0c\u60a8\u53ef\u80fd\u4ecd\u7136\u5fc5\u987b\u5b9e\u73b0\u7c7b\u7ea7\u5b89\u5168\u6027\u3002\u6b64\u5916\uff0c\u6240\u6709 \u4f7f\u7528 Pricebook2 \u7684 SOQL \u548c SOSL \u67e5\u8be2\u5c06\u5ffd\u7565\u8be5\u5173\u952e\u5b57\u3002\u65e0\u8bba\u5e94\u7528\u7684\u5171\u4eab\u5982\u4f55\uff0c\u90fd\u5c06\u8fd4\u56de\u6240\u6709\u4ef7\u76ee\u8868 \u89c4\u5219\u3002<samp>with sharing<\/samp><samp>without sharing<\/samp><samp>with sharing<\/samp>\u5f3a\u5236\u6267\u884c\u5f53\u524d\u7528\u6237\u7684\u5171\u4eab\u89c4\u5219\u53ef\u80fd\u4f1a\u5f71\u54cd\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>SOQL \u548c SOSL \u67e5\u8be2\u3002\u67e5\u8be2\u8fd4\u56de\u7684\u884c\u6570\u53ef\u80fd\u5c11\u4e8e\u5728\u7cfb\u7edf\u4e2d\u64cd\u4f5c\u7684\u884c\u6570 \u4e0a\u4e0b\u6587\u3002<\/li>\n\n\n\n<li>DML \u64cd\u4f5c\u3002\u64cd\u4f5c\u53ef\u80fd\u4f1a\u5931\u8d25\uff0c\u56e0\u4e3a\u5f53\u524d\u7528\u6237\u6ca1\u6709\u6b63\u786e\u7684 \u6743\u9650\u3002\u4f8b\u5982\uff0c\u5982\u679c\u7528\u6237\u6307\u5b9a\u4e86 \u7ec4\u7ec7\uff0c\u4f46\u5f53\u524d\u7528\u6237\u65e0\u6743\u8bbf\u95ee\u3002<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u5f3a\u5236\u6267\u884c\u5bf9\u8c61\u548c\u5b57\u6bb5\u6743\u9650<\/h2>\n\n\n\n<p>Apex \u901a\u5e38\u5728\u7cfb\u7edf\u4e0a\u4e0b\u6587\u4e2d\u8fd0\u884c;\u5373\u5f53\u524d\u7528\u6237\u7684\u6743\u9650\u548c \u5728\u4ee3\u7801\u6267\u884c\u8fc7\u7a0b\u4e2d\u4e0d\u8003\u8651\u5b57\u6bb5\u7ea7\u5b89\u5168\u6027\u3002\u5171\u4eab \u4f46\u662f\uff0c\u89c4\u5219\u5e76\u4e0d\u603b\u662f\u88ab\u7ed5\u8fc7\uff1a\u5fc5\u987b\u4f7f\u7528\u5173\u952e\u5b57\u58f0\u660e\u7c7b\uff0c\u4ee5\u786e\u4fdd \u4e0d\u5f3a\u5236\u6267\u884c\u5171\u4eab\u89c4\u5219\u3002\u4e0e\u8c03\u7528\u4e00\u8d77\u6267\u884c\u7684 Apex \u4ee3\u7801\uff0c\u5e76\u4e14\u59cb\u7ec8\u5728 Apex \u4e2d\u8fde\u63a5 \u4f7f\u7528\u5f53\u524d\u7528\u6237\u7684\u5171\u4eab\u89c4\u5219\u6267\u884c\u3002\u6709\u5173 \u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605\u533f\u540d\u5757\u3002<samp>without sharingexecuteAnonymousexecuteAnonymous<\/samp><\/p>\n\n\n\n<p>\u8981\u5f3a\u5236\u8fd0\u884c\u7528\u6237\u7684\u5b57\u6bb5\u7ea7\u5b89\u5168\u6027 \uff08FLS\uff09 \u548c\u5bf9\u8c61\u6743\u9650\uff0c\u8bf7\u60a8 \u53ef\u4ee5\u6307\u5b9a\u6570\u636e\u5e93\u64cd\u4f5c\u7684\u7528\u6237\u6a21\u5f0f\u8bbf\u95ee\u6743\u9650\u3002\u8bf7\u53c2\u9605\u5bf9\u6570\u636e\u5e93\u64cd\u4f5c\u5f3a\u5236\u4f7f\u7528\u7528\u6237\u6a21\u5f0f\u3002\u4f60 \u8fd8\u53ef\u4ee5\u4f7f\u7528 WITH SECURITY_ENFORCED\u5728 SOQL \u67e5\u8be2\u4e2d\u5f3a\u5236\u6267\u884c\u8fd9\u4e9b\u6743\u9650\u3002 \u6709\u5173\u8be6\u7ec6\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605\u4f7f\u7528 WITH SECURITY_ENFORCED\u7b5b\u9009 SOQL \u67e5\u8be2\u3002<\/p>\n\n\n\n<p>\u8fd8\u53ef\u4ee5\u901a\u8fc7\u663e\u5f0f\u65b9\u5f0f\u5728\u4ee3\u7801\u4e2d\u5f3a\u5236\u5b9e\u65bd\u5bf9\u8c61\u7ea7\u548c\u5b57\u6bb5\u7ea7\u6743\u9650 \u8c03\u7528 sObject describe \u7ed3\u679c\u65b9\u6cd5\uff08Schema.DescribeSObjectResult\uff09\u548c\u5b57\u6bb5 describe \u7ed3\u679c\u65b9\u6cd5\uff08Schema.DescribeFieldResult\uff09\uff0c\u7528\u4e8e\u68c0\u67e5 \u5f53\u524d\u7528\u6237\u7684\u8bbf\u95ee\u6743\u9650\u7ea7\u522b\u3002\u8fd9\u6837\uff0c\u60a8\u53ef\u4ee5\u9a8c\u8bc1\u5f53\u524d\u7528\u6237\u662f\u5426 \u5177\u6709\u5fc5\u8981\u7684\u6743\u9650\uff0c\u5e76\u4e14\u53ea\u6709\u5f53\u4ed6\u6216\u5979\u5177\u6709\u8db3\u591f\u7684\u6743\u9650\u65f6\uff0c\u60a8\u624d\u80fd \uff0c\u7136\u540e\u6267\u884c\u7279\u5b9a\u7684 DML \u64cd\u4f5c\u6216\u67e5\u8be2\u3002<\/p>\n\n\n\n<p>\u4f8b\u5982\uff0c\u60a8\u53ef\u4ee5\u8c03\u7528 \u3001 \u6216 \u65b9\u6cd5\u6765\u9a8c\u8bc1 \u5f53\u524d\u7528\u6237\u5206\u522b\u5177\u6709\u5bf9 sObject \u7684\u8bfb\u53d6\u3001\u521b\u5efa\u6216\u66f4\u65b0\u8bbf\u95ee\u6743\u9650\u3002\u540c\u6837\uff0c\u66b4\u9732\u8fd9\u4e9b \u60a8\u53ef\u4ee5\u8c03\u7528\u8fd9\u4e9b\u65b9\u6cd5\u68c0\u67e5\u5f53\u524d\u7528\u6237\u7684 read\u3001create\u3001or \u66f4\u65b0\u5b57\u6bb5\u7684\u8bbf\u95ee\u6743\u9650\u3002\u6b64\u5916\uff0c\u8fd8\u53ef\u4ee5\u8c03\u7528 \u63d0\u4f9b\u7684\u65b9\u6cd5\u6765\u68c0\u67e5\u5f53\u524d\u7528\u6237\u662f\u5426\u5177\u6709\u6743\u9650 \u5220\u9664\u7279\u5b9a\u7684 sObject\u3002<samp>isAccessible<\/samp><samp>isCreateable<\/samp><samp>isUpdateable<\/samp><samp>Schema.DescribeSObjectResult<\/samp><samp>Schema.DescribeFieldResult<\/samp><samp>isDeletable<\/samp><samp>Schema.DescribeSObjectResult<\/samp><\/p>\n\n\n\n<p>\u8fd9\u4e9b\u793a\u4f8b\u8c03\u7528\u8bbf\u95ee\u63a7\u5236\u65b9\u6cd5\u3002\u5728\u66f4\u65b0\u4e4b\u524d\u68c0\u67e5\u8054\u7cfb\u4eba\u7535\u5b50\u90ae\u4ef6\u5b57\u6bb5\u7684\u5b57\u6bb5\u7ea7\u66f4\u65b0\u6743\u9650 \u5b83\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if (Schema.sObjectType.Contact.fields.Email.isUpdateable()) {\n   \/\/ Update contact phone number\n}<\/code><\/pre>\n\n\n\n<p>\u8981\u5728\u521b\u5efa \u65b0\u589e\u529f\u80fd \u8054\u7cfb\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if (Schema.sObjectType.Contact.fields.Email.isCreateable()) {\n   \/\/ Create new contact\n}<\/code><\/pre>\n\n\n\n<p>\u5728\u67e5\u8be2\u4e4b\u524d\u68c0\u67e5\u8054\u7cfb\u4eba\u7535\u5b50\u90ae\u4ef6\u5b57\u6bb5\u7684\u5b57\u6bb5\u7ea7\u8bfb\u53d6\u6743\u9650 \u8fd9 \u7530\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if (Schema.sObjectType.Contact.fields.Email.isAccessible()) {\n   Contact c = &#91;SELECT Email FROM Contact WHERE Id= :Id];\n}<\/code><\/pre>\n\n\n\n<p>\u8981\u5728\u5220\u9664 \u8054\u7cfb\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if (Schema.sObjectType.Contact.isDeletable()) {\n   \/\/ Delete contact\n}<\/code><\/pre>\n\n\n\n<p>\u5171\u4eab\u89c4\u5219\u4e0d\u540c\u4e8e\u5bf9\u8c61\u7ea7\u548c\u5b57\u6bb5\u7ea7\u6743\u9650\u3002\u4ed6\u4eec\u53ef\u4ee5 \u5171\u5b58\u3002\u5982\u679c\u5728 Salesforce \u4e2d\u5b9a\u4e49\u4e86\u5171\u4eab\u89c4\u5219\uff0c\u5219\u53ef\u4ee5\u5728\u8bfe\u5802\u4e0a\u5f3a\u5236\u6267\u884c\u8fd9\u4e9b\u89c4\u5219 level \u901a\u8fc7\u4f7f\u7528\u5173\u952e\u5b57\u58f0\u660e\u7c7b\u3002\u6709\u5173\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605\u4f7f\u7528\u5171\u4eab\u5173\u952e\u5b57\u3001\u4e0d\u5171\u4eab\u5173\u952e\u5b57\u548c\u7ee7\u627f\u5171\u4eab\u5173\u952e\u5b57\u3002\u5982\u679c\u8c03\u7528 sObject \u63cf\u8ff0\u7ed3\u679c\u548c\u5b57\u6bb5 \u63cf\u8ff0\u7ed3\u679c\u8bbf\u95ee\u63a7\u5236\u65b9\u6cd5\uff0c\u5bf9\u8c61\u548c\u5b57\u6bb5\u7ea7\u522b\u7684\u9a8c\u8bc1 \u9664\u4e86\u6709\u6548\u7684\u5171\u4eab\u89c4\u5219\u4e4b\u5916\uff0c\u8fd8\u4f1a\u6267\u884c\u6743\u9650\u3002\u6709\u65f6 \u5171\u4eab\u89c4\u5219\u6388\u4e88\u7684\u8bbf\u95ee\u7ea7\u522b\u53ef\u80fd\u4e0e\u5bf9\u8c61\u7ea7\u522b\u6216 \u5b57\u6bb5\u7ea7\u6743\u9650\u3002<samp>with sharing<\/samp><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u8003\u8651<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u542f\u7528\u4e86 Experience Cloud \u7ad9\u70b9\u7684\u7ec4\u7ec7\u63d0\u4f9b\u4e86\u5404\u79cd\u8bbe\u7f6e\u6765\u9690\u85cf \u5bf9\u5176\u4ed6\u7528\u6237\u63d0\u4f9b\u7528\u6237\u7684\u4e2a\u4eba\u4fe1\u606f\uff08\u8bf7\u53c2\u9605\u5bf9\u5916\u90e8\u9690\u85cf\u4e2a\u4eba\u4fe1\u606f \u7528\u6237\u5e76\u5728\u5185\u5171\u4eab\u4e2a\u4eba\u8054\u7cfb\u4fe1\u606f Experience Cloud \u7ad9\u70b9\uff09\u3002\u5373\u4f7f\u5728 Apex \u4e2d\u4e5f\u4e0d\u4f1a\u5f3a\u5236\u6267\u884c\u8fd9\u4e9b\u8bbe\u7f6e \u5177\u6709\u5b50\u53e5\u6216\u65b9\u6cd5\u7b49\u5b89\u5168\u529f\u80fd\u3002\u9690\u85cf\u7528\u6237\u7684\u7279\u5b9a\u5b57\u6bb5 \u5bf9\u8c61\uff0c\u8bf7\u6309\u7167\u9075\u5b88\u7528\u6237\u4e2a\u4eba\u4e2d\u6982\u8ff0\u7684\u793a\u4f8b\u4ee3\u7801\u8fdb\u884c\u64cd\u4f5c&nbsp;\u4fe1\u606f\u53ef\u89c1\u6027\u8bbe\u7f6e\u3002<samp>WITH SECURITY_ENFORCEDstripInaccessible<\/samp><\/li>\n\n\n\n<li>\u81ea\u52a8\u5316\u6d41\u7a0b\u7528\u6237\u65e0\u6cd5\u5728\u81ea\u5b9a\u4e49\u4ee3\u7801\u4e2d\u6267\u884c\u5bf9\u8c61\u548c FLS \u68c0\u67e5 \u9664\u975e\u5c06\u9002\u5f53\u7684\u6743\u9650\u96c6\u663e\u5f0f\u5e94\u7528\u4e8e\u8fd9\u4e9b\u7528\u6237\u3002<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u5bf9\u6570\u636e\u5e93\u64cd\u4f5c\u5f3a\u5236\u5b9e\u65bd\u7528\u6237\u6a21\u5f0f<\/h2>\n\n\n\n<p>\u60a8\u53ef\u4ee5\u5728\u7528\u6237\u6a21\u5f0f\u4e0b\u8fd0\u884c\u6570\u636e\u5e93\u64cd\u4f5c\uff0c\u800c\u4e0d\u662f\u5728\u9ed8\u8ba4\u7cfb\u7edf\u6a21\u5f0f\u4e0b\u8fd0\u884c \u901a\u8fc7\u4f7f\u7528\u5e26\u6709\u7279\u6b8a\u5173\u952e\u5b57\u7684 SOQL \u6216 SOSL \u67e5\u8be2\u6216\u4f7f\u7528 DML \u65b9\u6cd5 \u91cd\u8f7d\u3002<\/p>\n\n\n\n<p>\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0cApex \u4ee3\u7801\u5728\u7cfb\u7edf\u6a21\u5f0f\u4e0b\u8fd0\u884c\uff0c\u8fd9\u610f\u5473\u7740\u5b83\u4ee5\u5b9e\u8d28 \u63d0\u5347\u4e86\u5bf9\u8fd0\u884c\u4ee3\u7801\u7684\u7528\u6237\u7684\u6743\u9650\u3002\u589e\u5f3a Apex\uff0c\u60a8\u53ef\u4ee5\u4e3a\u6570\u636e\u5e93\u64cd\u4f5c\u6307\u5b9a\u7528\u6237\u6a21\u5f0f\u8bbf\u95ee\u3002\u5b57\u6bb5\u7ea7\u5b89\u5168\u6027 \uff08FLS\uff09 \u548c\u6b63\u5728\u8fd0\u884c\u7684\u7528\u6237\u7684\u5bf9\u8c61\u6743\u9650\u5728\u7528\u6237\u6a21\u5f0f\u4e0b\u53d7\u5230\u5c0a\u91cd\uff0c\u8fd9\u4e0e \u7cfb\u7edf\u6a21\u5f0f\u3002\u7528\u6237\u6a21\u5f0f\u59cb\u7ec8\u5e94\u7528\u5171\u4eab\u89c4\u5219\uff0c\u4f46\u5728\u7cfb\u7edf\u6a21\u5f0f\u4e0b\uff0c\u5b83\u4eec \u901a\u8fc7\u5728\u7c7b\u4e0a\u5171\u4eab\u5173\u952e\u5b57\u6765\u63a7\u5236\u3002\u8bf7\u53c2\u9605\u4f7f\u7528\u6709\u5171\u4eab\u3001\u65e0\u5171\u4eab\u548c\u7ee7\u627f\u5171\u4eab\u5173\u952e\u5b57\u3002\u60a8\u53ef\u4ee5\u901a\u8fc7\u4f7f\u7528 \u6216 \u5728\u60a8\u7684 SOQL \u6216 SOSL \u67e5\u8be2\u3002\u6b64\u793a\u4f8b\u5728 SOQL \u4e2d\u6307\u5b9a\u7528\u6237\u6a21\u5f0f\u3002<\/p>\n\n\n\n<p><samp>WITH USER_MODE<\/samp><samp>WITH SYSTEM_MODE<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>List&lt;Account&gt; acc = &#91;SELECT Id FROM Account WITH USER_MODE];\n<\/code><\/pre>\n\n\n\n<p>\u6ce8\u610f<\/p>\n\n\n\n<p>\u6b64\u529f\u80fd\u5728\u542f\u7528\u4e86\u8be5\u529f\u80fd\u7684\u4e34\u65f6\u7ec4\u7ec7\u4e2d\u53ef\u7528\u3002\u5982\u679c\u672a\u542f\u7528\u8be5\u529f\u80fd\uff0c \u5177\u6709\u6b64\u529f\u80fd\u7684 Apex \u4ee3\u7801\u53ef\u4ee5\u7f16\u8bd1\uff0c\u4f46\u4e0d\u80fd\u6267\u884c\u3002<samp>ApexUserModeWithPermset<\/samp><\/p>\n\n\n\n<p>Salesforce \u5efa\u8bae\u60a8\u901a\u8fc7\u4f7f\u7528\u800c\u4e0d\u662f\u56e0\u4e3a\u8fd9\u4e9b\u989d\u5916\u7684\u4f18\u52bf\u6765\u5f3a\u5236\u5b9e\u65bd\u5b57\u6bb5\u7ea7\u5b89\u5168\u6027 \uff08FLS\uff09\u3002<samp>WITH USER_MODE<\/samp><samp>WITH SECURITY-ENFORCED<\/samp><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><samp>WITH USER_MODE<\/samp>\u8003\u8651\u591a\u6001\u5b57\u6bb5 like \u548c .<samp>Owner<\/samp><samp>Task.whatId<\/samp><\/li>\n\n\n\n<li><samp>WITH USER_MODE<\/samp>\u5904\u7406 SOQL \u8bed\u53e5\u4e2d\u7684\u6240\u6709\u5b50\u53e5\uff0c\u5305\u62ec\u5b50\u53e5\u3002<samp>SELECT<\/samp><samp>WHERE<\/samp><\/li>\n\n\n\n<li><samp>WITH USER_MODE<\/samp>\u67e5\u627e SOQL \u4e2d\u7684\u6240\u6709 FLS \u9519\u8bef \u67e5\u8be2\uff0c\u800c\u53ea\u67e5\u627e \u7b2c\u4e00\u4e2a\u9519\u8bef\u3002\u6b64\u5916\uff0c\u5728\u7528\u6237\u6a21\u5f0f\u4e0b\uff0c\u53ef\u4ee5\u4f7f\u7528 QueryException \u4e0a\u7684\u65b9\u6cd5\u68c0\u67e5\u5b8c\u6574\u7684 \u8bbf\u95ee\u9519\u8bef\u96c6\u3002<samp>WITH SECURITY ENFORCED<\/samp><samp>getInaccessibleFields()<\/samp><\/li>\n<\/ul>\n\n\n\n<p>\u6570\u636e\u5e93\u64cd\u4f5c\u53ef\u4ee5\u6307\u5b9a\u7528\u6237\u6a21\u5f0f\u6216\u7cfb\u7edf\u6a21\u5f0f\u3002\u672c\u793a\u4f8b\u63d2\u5165\u4e00\u4e2a\u65b0\u7684 \u7528\u6237\u4e2d\u7684\u5e10\u6237 \u6a21\u5f0f\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Account acc = new Account(Name='test');\ninsert as user acc;<\/code><\/pre>\n\n\n\n<p>\u8be5\u7c7b\u8868\u793a \u54ea\u4e2a Apex \u8fd0\u884c\u6570\u636e\u5e93\u64cd\u4f5c\u3002\u4f7f\u7528\u6b64\u7c7b\u5c06\u6267\u884c\u6a21\u5f0f\u5b9a\u4e49\u4e3a user \u6a21\u5f0f\u6216\u7cfb\u7edf\u6a21\u5f0f\u3002\u6570\u636e\u5e93\u4e2d\u7684\u53ef\u9009\u53c2\u6570 \u548c \u641c\u7d22\u65b9\u6cd5 \u6307\u5b9a\u8be5\u65b9\u6cd5\u662f\u5728\u7cfb\u7edf\u6a21\u5f0f \uff08\uff09 \u8fd8\u662f\u7528\u6237\u6a21\u5f0f \uff08\uff09 \u4e0b\u8fd0\u884c\u3002\u4f7f\u7528\u8fd9\u4e9b\u91cd\u8f7d\u65b9\u6cd5\u53ef\u4ee5 \u6267\u884c DML \u548c\u67e5\u8be2\u64cd\u4f5c\u3002<samp>AccessLevel<\/samp><var>accessLevel<\/var><samp>AccessLevel.SYSTEM_MODE<\/samp><samp>AccessLevel.USER_MODE<\/samp><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><samp>Database.query<\/samp>&nbsp;\u65b9\u6cd5\u3002\u8bf7\u53c2\u9605\u52a8\u6001 SOQL\u3002<\/li>\n\n\n\n<li><samp>Database.getQueryLocator<\/samp>&nbsp;\u65b9\u6cd5<\/li>\n\n\n\n<li><samp>Database.countQuery<\/samp>&nbsp;\u65b9\u6cd5<\/li>\n\n\n\n<li><samp>Search.query<\/samp>&nbsp;\u65b9\u6cd5<\/li>\n\n\n\n<li>\u6570\u636e\u5e93 DML \u65b9\u6cd5\uff08<samp>insert update upsert merge delete undelete convertLead<\/samp>)\n<ul class=\"wp-block-list\">\n<li>\u5305\u62ec \u548c \u65b9\u6cd5\uff0c\u4f8b\u5982 \u548c \u3002<samp>*Immediate<\/samp><samp>*Async<\/samp><samp>insertImmediate<\/samp><samp>deleteAsync<\/samp><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>\u6ce8\u610f<\/p>\n\n\n\n<p>\u5f53\u6570\u636e\u5e93 DML \u65b9\u6cd5\u4e0e \u4e00\u8d77\u8fd0\u884c\u65f6\uff0c\u60a8\u53ef\u4ee5\u901a\u8fc7 \u8bbf\u95ee\u9519\u8bef\u3002\u4f7f\u7528 \uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528\u8be5\u65b9\u6cd5\u901a\u8fc7 FLS \u83b7\u53d6\u5b57\u6bb5 \u9519\u8bef\u3002<samp>AccessLevel.USER_MODE<\/samp><samp>SaveResult.getErrors().getFields()<\/samp><samp>insert as user<\/samp><samp>DMLException<\/samp><samp>getFieldNames()<\/samp><\/p>\n\n\n\n<p>\u8fd9\u4e9b\u65b9\u6cd5\u9700\u8981\u8be5\u53c2\u6570\u3002<var>accessLevel<\/var><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><samp>Database.queryWithBinds<\/samp><\/li>\n\n\n\n<li><samp>Database.getQueryLocatorWithBinds<\/samp><\/li>\n\n\n\n<li><samp>Database.countQueryWithBinds<\/samp><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u4f7f\u7528\u6743\u9650\u96c6\u5728 DML \u548c\u641c\u7d22\u64cd\u4f5c\u4e2d\u5f3a\u5236\u5b9e\u65bd\u5b89\u5168\u6027\uff08\u5f00\u53d1\u4eba\u5458 \u9884\u89c8\uff09<\/h2>\n\n\n\n<p>\u5728\u5f00\u53d1\u8005\u9884\u89c8\u7248\u4e2d\uff0c\u60a8\u53ef\u4ee5\u6307\u5b9a\u7528\u4e8e\u6269\u5145\u5b57\u6bb5\u7ea7\u522b\u7684\u6743\u9650\u96c6 \u4ee5\u53ca\u6570\u636e\u5e93\u548c\u641c\u7d22\u64cd\u4f5c\u7684\u5bf9\u8c61\u7ea7\u5b89\u5168\u6027\u3002\u4f7f\u7528 \u6307\u5b9a\u7684\u6743\u9650\u96c6 ID\u3002 \u6267\u884c\u7684\u7279\u5b9a\u7528\u6237\u6a21\u5f0f DML \u64cd\u4f5c \u6709\u4e86\u8fd9\u4e2a\uff0c\u8bf7\u5c0a\u91cd \u9664\u4e86\u8fd0\u884c\u7528\u6237\u7684\u6743\u9650\u5916\uff0c\u8fd8\u8bbe\u7f6e\u4e86\u6307\u5b9a\u7684\u6743\u9650\u96c6\u3002<samp>AccessLevel.withPermissionSetId()<\/samp><samp>AccessLevel<\/samp>\u6b64\u793a\u4f8b\u8fd0\u884c\u8be5\u65b9\u6cd5 \u5177\u6709\u6307\u5b9a\u7684\u6743\u9650\u96c6\u5e76\u63d2\u5165\u81ea\u5b9a\u4e49 \u5bf9\u8c61\u3002<\/p>\n\n\n\n<p><samp>AccessLevel.withPermissionSetId()<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@isTest\npublic with sharing class ElevateUserModeOperations_Test {\n    @isTest\n    static void objectCreatePermViaPermissionSet() {\n        Profile p = &#91;SELECT Id FROM Profile WHERE Name='Minimum Access - Salesforce'];\n        User u = new User(Alias = 'standt', Email='standarduser@testorg.com',\n            EmailEncodingKey='UTF-8', LastName='Testing', LanguageLocaleKey='en_US',\n            LocaleSidKey='en_US', ProfileId = p.Id,\n            TimeZoneSidKey='America\/Los_Angeles',\n            UserName='standarduser' + DateTime.now().getTime() + '@testorg.com');\n\n        System.runAs(u) {\n            try { \n                Database.insert(new Account(name='foo'), AccessLevel.User_mode); \n                Assert.fail(); \n            } catch (SecurityException ex) { \n                Assert.isTrue(ex.getMessage().contains('Account'));\n            }\n            \/\/Get ID of previously created permission set named 'AllowCreateToAccount'\n            Id permissionSetId = &#91;Select Id from PermissionSet \n                where Name = 'AllowCreateToAccount' limit 1].Id;\n\n            Database.insert(new Account(name='foo'), AccessLevel.User_mode.withPermissionSetId(permissionSetId)); \n\n            \/\/ The elevated access level is not persisted to subsequent operations\n            try { \n                Database.insert(new Account(name='foo2'), AccessLevel.User_mode); \n                Assert.fail(); \n            } catch (SecurityException ex) { \n                Assert.isTrue(ex.getMessage().contains('Account')); \n            } \n            \n        } \n    } \n}\n<\/code><\/pre>\n\n\n\n<p>\u6ce8\u610f<\/p>\n\n\n\n<p>Checkmarx\uff0cAppExchange Security Review&nbsp;\u6e90\u4ee3\u7801 \u626b\u63cf\u4eea\uff0c\u5c1a\u672a\u4f7f\u7528\u6b64\u65b0\u7684 Apex \u529f\u80fd\u8fdb\u884c\u66f4\u65b0\u3002\u5728\u66f4\u65b0\u4e4b\u524d\uff0c Checkmarx\u53ef\u4ee5\u9488\u5bf9\u73b0\u573a\u6216\u5bf9\u8c61\u7ea7\u5b89\u5168\u8fdd\u89c4\u884c\u4e3a\u751f\u6210\u8bef\u62a5 \u9700\u8981\u5f02\u5e38\u6587\u6863\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u4f7f\u7528 stripInaccessible \u65b9\u6cd5\u5f3a\u5236\u5b9e\u65bd\u5b89\u5168\u6027<\/h2>\n\n\n\n<p>\u4f7f\u7528\u8be5\u65b9\u6cd5\u5f3a\u5236\u6267\u884c \u5b57\u6bb5\u7ea7\u548c\u5bf9\u8c61\u7ea7\u6570\u636e\u4fdd\u62a4\u3002\u6b64\u65b9\u6cd5\u53ef\u7528\u4e8e\u5265\u79bb\u5b57\u6bb5\u548c \u7528\u6237\u65e0\u6cd5\u8bbf\u95ee\u7684\u67e5\u8be2\u548c\u5b50\u67e5\u8be2\u7ed3\u679c\u4e2d\u7684\u5173\u7cfb\u5b57\u6bb5\u3002\u8be5\u65b9\u6cd5\u53ef\u4ee5 \u4e5f\u7528\u4e8e\u5728 DML \u64cd\u4f5c\u4e4b\u524d\u5220\u9664\u65e0\u6cd5\u8bbf\u95ee\u7684 sObject \u5b57\u6bb5\uff0c\u4ee5\u907f\u514d\u5f02\u5e38\u548c \u6e05\u7406\u5df2\u4ece\u4e0d\u53d7\u4fe1\u4efb\u7684\u6765\u6e90\u53cd\u5e8f\u5217\u5316\u7684 sObject\u3002<\/p>\n\n\n\n<p><samp>stripInaccessible<\/samp><\/p>\n\n\n\n<p>\u91cd\u8981<\/p>\n\n\n\n<p>\u5728\u53ef\u80fd\u7684\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u66f4\u6539\u4e86\u975e\u5305\u5bb9\u6027\u6761\u6b3e\uff0c\u4ee5\u4e0e\u6211\u4eec\u516c\u53f8\u4fdd\u6301\u4e00\u81f4 \u5e73\u7b49\u7684\u4ef7\u503c\u3002\u6211\u4eec\u4fdd\u7559\u4e86\u67d0\u4e9b\u6761\u6b3e\uff0c\u4ee5\u907f\u514d\u5bf9\u5ba2\u6237\u4ea7\u751f\u4efb\u4f55\u5f71\u54cd \u5b9e\u73b0\u3002<\/p>\n\n\n\n<p>\u5b57\u6bb5\u7ea7\u548c\u5bf9\u8c61\u7ea7\u6570\u636e\u4fdd\u62a4\u53ef\u901a\u8fc7&nbsp;Security&nbsp;\u548c&nbsp;SObjectAccessDecision&nbsp;\u7c7b\u8fdb\u884c\u8bbf\u95ee\u3002\u8bbf\u95ee\u68c0\u67e5\u662f \u57fa\u4e8e\u5f53\u524d\u7528\u6237\u5728\u6307\u5b9a\u4e0a\u4e0b\u6587\u4e2d\u7684\u5b57\u6bb5\u7ea7\u6743\u9650 \u64cd\u4f5c &#8211; \u521b\u5efa\u3001\u8bfb\u53d6\u3001\u66f4\u65b0\u6216\u66f4\u65b0\u63d2\u5165\u3002Security.stripInaccessible\uff08\uff09&nbsp;\u65b9\u6cd5\u68c0\u67e5\u6e90\u4ee3\u7801 \u4e0d\u7b26\u5408\u5f53\u524d\u7528\u6237\u7684\u5b57\u6bb5\u7ea7\u5b89\u5168\u68c0\u67e5\u7684\u5b57\u6bb5\u7684\u8bb0\u5f55\u3002\u8fd9 \u65b9\u6cd5\u8fd8\u68c0\u67e5\u6e90\u8bb0\u5f55\u4e2d\u67e5\u627e\u6216\u4e3b\u4ece\u5173\u7cfb\u5b57\u6bb5\u5230\u7684\u5b57\u6bb5 \u5f53\u524d\u7528\u6237\u65e0\u6743\u8bbf\u95ee\u3002\u8be5\u65b9\u6cd5\u521b\u5efa sObjects \u7684\u8fd4\u56de\u5217\u8868\uff0c\u8be5\u5217\u8868\u662f \u4e0e\u6e90\u8bb0\u5f55\u76f8\u540c\uff0c\u53ea\u662f\u5f53\u524d\u65e0\u6cd5\u8bbf\u95ee\u7684\u5b57\u6bb5 \u7528\u6237\u88ab\u5220\u9664\u3002\u8be5\u65b9\u6cd5\u8fd4\u56de\u7684 sObject \u5305\u542b\u7684\u8bb0\u5f55\u4e0e\u65b9\u6cd5\u53c2\u6570\u4e2d\u7684 sObject \u987a\u5e8f\u76f8\u540c\u3002<samp>getRecordssourceRecordsstripInaccessible<\/samp><\/p>\n\n\n\n<p>\u4f5c\u4e3a\u5f00\u53d1\u4eba\u5458\u9884\u89c8\u7248\u529f\u80fd\uff0c\u5c06\u6743\u9650\u96c6 ID \u4f5c\u4e3a\u53c2\u6570\u5e76\u5f3a\u5236\u6267\u884c \u6839\u636e\u6307\u5b9a\u7684\u6743\u9650\u96c6\u8fdb\u884c\u5b57\u6bb5\u7ea7\u548c\u5bf9\u8c61\u7ea7\u8bbf\u95ee\uff0c\u6b64\u5916 \u8fd0\u884c\u7528\u6237\u7684\u6743\u9650\u3002<samp>Security.stripInaccessible()<\/samp><\/p>\n\n\n\n<p>\u6ce8\u610f<\/p>\n\n\n\n<p>\u8be5\u65b9\u6cd5\u6c38\u8fdc\u4e0d\u4f1a\u5265\u79bb ID \u5b57\u6bb5\uff0c\u4ee5\u907f\u514d\u5728\u5bf9\u7ed3\u679c\u6267\u884c DML \u65f6\u51fa\u73b0\u95ee\u9898\u3002<samp>stripInaccessible<\/samp><\/p>\n\n\n\n<p>\u8981\u8bc6\u522b\u5df2\u5220\u9664\u7684\u4e0d\u53ef\u8bbf\u95ee\u5b57\u6bb5\uff0c\u53ef\u4ee5\u4f7f\u7528&nbsp;SObject.isSet\uff08\uff09&nbsp;\u65b9\u6cd5\u3002\u4f8b\u5982\uff0c\u8fd4\u56de\u5217\u8868 \u5305\u542b Contact \u5bf9\u8c61\u548c\u65e0\u6cd5\u8bbf\u95eesocial_security_number__c\u81ea\u5b9a\u4e49\u5b57\u6bb5 \u7528\u6237\u3002\u7531\u4e8e\u6b64\u81ea\u5b9a\u4e49\u5b57\u6bb5\u672a\u901a\u8fc7\u5b57\u6bb5\u7ea7\u8bbf\u95ee\u68c0\u67e5\uff0c\u56e0\u6b64\u672a\u8bbe\u7f6e\u8be5\u5b57\u6bb5 \u5e76\u8fd4\u56de .<samp>isSetfalse<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SObjectAccessDecision securityDecision = Security.stripInaccessible(AccessType.READABLE, sourceRecords);\nContact c = securityDecision.getRecords()&#91;0];\nSystem.debug(c.isSet('social_security_number__c')); \/\/ prints \"false\"<\/code><\/pre>\n\n\n\n<p>\u6ce8\u610f<\/p>\n\n\n\n<p>\u8be5\u65b9\u6cd5\u4e0d\u652f\u6301 AggregateResult SObject\u3002\u5982\u679c\u6e90\u8bb0\u5f55\u4e3a AggregateResult SObject \u7c7b\u578b\uff0c\u5219 \u5f15\u53d1\u5f02\u5e38\u3002<samp>stripInaccessible<\/samp><\/p>\n\n\n\n<p id=\"user_pii_communities\">\u5bf9 User \u5bf9\u8c61\u5f3a\u5236\u6267\u884c\u5bf9\u8c61\u548c\u5b57\u6bb5\u6743\u9650\u5e76\u9690\u85cf \u5177\u6709 Experience Cloud \u7ad9\u70b9\u7684\u7ec4\u7ec7\u4e2d\u5176\u4ed6\u7528\u6237\u7684\u7528\u6237\u4e2a\u4eba\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605\u5f3a\u5236\u6267\u884c\u5bf9\u8c61\u548c\u5b57\u6bb5\u6743\u9650\u3002<\/p>\n\n\n\n<p>\u4ee5\u4e0b\u662f\u53ef\u4ee5\u4f7f\u7528\u8be5\u65b9\u6cd5\u7684\u4e00\u4e9b\u793a\u4f8b\u3002<samp>stripInaccessible<\/samp><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u4f8b<\/h2>\n\n\n\n<p>\u6b64\u793a\u4f8b\u4ee3\u7801\u4ece\u67e5\u8be2\u7ed3\u679c\u4e2d\u5220\u9664\u65e0\u6cd5\u8bbf\u95ee\u7684\u5b57\u6bb5\u3002\u5c55\u793a\u53f0 \u5bf9\u4e8e\u5e7f\u544a\u7cfb\u5217\u6570\u636e\uff0c\u5fc5\u987b\u59cb\u7ec8\u663e\u793a . \u5fc5\u987b\u4ec5\u5411\u5177\u6709 \u8bfb\u53d6\u8be5\u5b57\u6bb5\u7684\u6743\u9650\u3002<\/p>\n\n\n\n<p><samp>BudgetedCost<\/samp><samp>ActualCost<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SObjectAccessDecision securityDecision = \n         Security.stripInaccessible(AccessType.READABLE,\n                 &#91;SELECT Name, BudgetedCost, ActualCost FROM Campaign]                 );\n\n    \/\/ Construct the output table\n    if (securityDecision.getRemovedFields().get('Campaign').contains('ActualCost')) {\n        for (Campaign c : securityDecision.getRecords()) {\n        \/\/System.debug Output: Name, BudgetedCost\n        }\n    } else {\n        for (Campaign c : securityDecision.getRecords()) {\n        \/\/System.debug Output: Name, BudgetedCost, ActualCost\n        }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u4f8b<\/h2>\n\n\n\n<p>\u6b64\u793a\u4f8b\u4ee3\u7801\u4ece\u5b50\u67e5\u8be2\u7ed3\u679c\u4e2d\u5220\u9664\u4e0d\u53ef\u8bbf\u95ee\u7684\u5b57\u6bb5\u3002\u7528\u6237 \u65e0\u6743\u8bfb\u53d6 \u63a5\u89e6 \u5bf9\u8c61\u3002<\/p>\n\n\n\n<p><samp>Phone<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>List&lt;Account&gt; accountsWithContacts =\n\t&#91;SELECT Id, Name, Phone,\n\t    (SELECT Id, LastName, Phone FROM Account.Contacts)\n\tFROM Account];\n  \n   \/\/ Strip fields that are not readable\n   SObjectAccessDecision decision = Security.stripInaccessible(\n\t                                   AccessType.READABLE,\n\t                                   accountsWithContacts);\n \n\/\/ Print stripped records\n   for (Integer i = 0; i &lt; accountsWithContacts.size(); i++) \n  {\n      System.debug('Insecure record access: '+accountsWithContacts&#91;i]);\n      System.debug('Secure record access: '+decision.getRecords()&#91;i]);\n   }\n \n\/\/ Print modified indexes\n   System.debug('Records modified by stripInaccessible: '+decision.getModifiedIndexes());\n \n\/\/ Print removed fields\n   System.debug('Fields removed by stripInaccessible: '+decision.getRemovedFields());<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u4f8b<\/h2>\n\n\n\n<p>\u6b64\u793a\u4f8b\u4ee3\u7801\u5728 DML \u64cd\u4f5c\u4e4b\u524d\u4ece sObject \u4e2d\u5220\u9664\u4e0d\u53ef\u8bbf\u95ee\u7684\u5b57\u6bb5\u3002\u8fd9 \u65e0\u6743\u4e3a\u5e10\u6237\u521b\u5efa\u8bc4\u7ea7\u7684\u7528\u6237\u4ecd\u7136\u53ef\u4ee5\u521b\u5efa\u5e10\u6237\u3002 \u8be5\u65b9\u6cd5\u786e\u4fdd\u672a\u8bbe\u7f6e Rating\uff0c\u5e76\u4e14\u4e0d\u4f1a\u5f15\u53d1\u5f02\u5e38\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>List&lt;Account&gt; newAccounts = new List&lt;Account&gt;();\nAccount a = new Account(Name='Acme Corporation');\nAccount b = new Account(Name='Blaze Comics', Rating=\u2019Warm\u2019);\nnewAccounts.add(a);\nnewAccounts.add(b);\n\nSObjectAccessDecision securityDecision = Security.stripInaccessible(\n                                         AccessType.CREATABLE, newAccounts);\n\n\/\/ No exceptions are thrown and no rating is set\ninsert securityDecision.getRecords();\n\nSystem.debug(securityDecision.getRemovedFields().get('Account')); \/\/ Prints \"Rating\"\nSystem.debug(securityDecision.getModifiedIndexes()); \/\/ Prints \"1\"<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u4f8b<\/h2>\n\n\n\n<p>\u6b64\u793a\u4f8b\u4ee3\u7801\u6e05\u7406\u5df2\u4ece\u4e0d\u53d7\u4fe1\u4efb\u7684 sObject \u53cd\u5e8f\u5217\u5316\u7684 sObject \u6e90\u3002\u7528\u6237\u65e0\u6743\u66f4\u65b0 \u5e10\u6237\u3002<\/p>\n\n\n\n<p><samp>AnnualRevenue<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>String jsonInput =\n'&#91;' +\n'{' +\n'\"Name\": \"InGen\",' +\n'\"AnnualRevenue\": \"100\"' +\n'},' +\n'{' +\n'\"Name\": \"Octan\"' +\n'}' +\n']';\n\nList&lt;Account&gt; accounts = (List&lt;Account&gt;)JSON.deserializeStrict(jsonInput, List&lt;Account&gt;.class);\nSObjectAccessDecision securityDecision = Security.stripInaccessible(\n                                         AccessType.UPDATABLE, accounts);\n\n\/\/ Secure update\nupdate securityDecision.getRecords(); \/\/ Doesn\u2019t update AnnualRevenue field\nSystem.debug(String.join(securityDecision.getRemovedFields().get('Account'), ', ')); \/\/ Prints \"AnnualRevenue\"\nSystem.debug(String.join(securityDecision.getModifiedIndexes(), ', ')); \/\/ Prints \"0\u201d<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u4f8b<\/h2>\n\n\n\n<p>\u6b64\u793a\u4f8b\u4ee3\u7801\u4ece\u67e5\u8be2\u7ed3\u679c\u4e2d\u5220\u9664\u4e0d\u53ef\u8bbf\u95ee\u7684\u5173\u7cfb\u5b57\u6bb5\u3002\u8fd9 \u7528\u6237\u65e0\u6743\u63d2\u5165\u5b57\u6bb5\uff0c\u8be5\u5b57\u6bb5\u662f\u4ece MyCustomObject__c \u5230 \u5e10\u6237\u3002<\/p>\n\n\n\n<p><samp>Account__c<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Account__c is a lookup from MyCustomObject__c to Account\n@IsTest\n   public class TestCustomObjectLookupStripped {\n      @IsTest static void caseCustomObjectStripped() {\n         Account a = new Account(Name='foo');\n         insert a;\n         List&lt;MyCustomObject__c&gt; records = new List&lt;MyCustomObject__c&gt;{\n            new MyCustomObject__c(Name='Custom0', Account__c=a.id)\n         };\n         insert records;\n         records = &#91;SELECT Id, Account__c FROM MyCustomObject__c];\n         SObjectAccessDecision securityDecision = Security.stripInaccessible\n                                                  (AccessType.READABLE, records);\n         \n         \/\/ Verify stripped records\n         System.assertEquals(1, securityDecision.getRecords().size());\n         for (SObject strippedRecord : securityDecision.getRecords()) {\n             System.debug('Id should be set as Id fields are ignored: ' + \n                           strippedRecord.isSet('Id')); \/\/ prints true\n             System.debug('Lookup field FLS is not READABLE to running user, \n                           should not be set: ' +\n                           strippedRecord.isSet('Account__c')); \/\/ prints false\n         }\n      }\n   }<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u4f7f\u7528 WITH SECURITY_ENFORCED\u7b5b\u9009 SOQL \u67e5\u8be2<\/h2>\n\n\n\n<p>\u4f7f\u7528\u5b50\u53e5\u542f\u7528 \u5bf9 Apex \u4ee3\u7801\u4e2d\u7684\u67e5\u8be2\uff08\u5305\u62ec\u5b50\u67e5\u8be2\u548c\u8de8\u5bf9\u8c61\uff09\u8fdb\u884c\u5b57\u6bb5\u7ea7\u548c\u5bf9\u8c61\u7ea7\u5b89\u5168\u6743\u9650\u68c0\u67e5 \u5173\u7cfb\u3002<\/p>\n\n\n\n<p><samp>WITH SECURITY_ENFORCED<\/samp><samp>SOQL SELECT<\/samp><\/p>\n\n\n\n<p>Apex \u901a\u5e38\u5728\u7cfb\u7edf\u4e0a\u4e0b\u6587\u4e2d\u8fd0\u884c;\u5373\u5f53\u524d\u7528\u6237\u7684\u6743\u9650\u548c \u5728\u4ee3\u7801\u6267\u884c\u8fc7\u7a0b\u4e2d\u4e0d\u8003\u8651\u5b57\u6bb5\u7ea7\u5b89\u5168\u6027\u3002\u5171\u4eab\u89c4\u5219\uff0c \u4f46\u662f\uff0c\u5e76\u4e0d\u603b\u662f\u88ab\u7ed5\u8fc7\uff1a\u5fc5\u987b\u4f7f\u7528\u5173\u952e\u5b57\u58f0\u660e\u7c7b\uff0c\u4ee5\u786e\u4fdd\u5171\u4eab \u4e0d\u5f3a\u5236\u6267\u884c\u89c4\u5219\u3002\u5c3d\u7ba1\u6267\u884c\u5b57\u6bb5\u548c\u5bf9\u8c61\u7ea7\u5b89\u5168\u68c0\u67e5\u662f \u5728\u65e9\u671f\u7248\u672c\u4e2d\uff0c\u6b64\u5b50\u53e5\u53ef\u80fd\u5927\u5927\u51cf\u5c11\u4e86\u5197\u957f\u548c\u6280\u672f\u6027 \u67e5\u8be2\u64cd\u4f5c\u7684\u590d\u6742\u6027\u3002\u6b64\u529f\u80fd\u4e13\u4e3a Apex \u5f00\u53d1\u4eba\u5458\u91cf\u8eab\u5b9a\u5236\uff0c\u4ed6\u4eec\u62e5\u6709\u6700\u5c11\u7684 \u5177\u6709\u5b89\u5168\u6027\u548c\u4f18\u96c5\u964d\u7ea7\u7684\u5e94\u7528\u7a0b\u5e8f\u7684\u5f00\u53d1\u7ecf\u9a8c \u6743\u9650\u9519\u8bef\u4e0d\u662f\u5fc5\u9700\u7684\u3002<samp>without sharing<\/samp><\/p>\n\n\n\n<p>\u6ce8\u610f<\/p>\n\n\n\n<p>\u8be5\u6761\u6b3e\u4ec5 \u5728 Apex \u4e2d\u53ef\u7528\u3002\u6211\u4eec\u4e0d\u5efa\u8bae\u5728 Apex \u7c7b\u6216\u89e6\u53d1\u5668\u4e2d\u4f7f\u7528\u65e9\u4e8e API \u7684\u7248\u672c 45.0.<samp>WITH SECURITY_ENFORCED<\/samp><samp>WITH SECURITY_ENFORCED<\/samp><\/p>\n\n\n\n<p><samp>WITH SECURITY_ENFORCED<\/samp>\u5e94\u7528\u5b57\u6bb5\u548c \u5bf9\u8c61\u7ea7\u5b89\u5168\u68c0\u67e5\u4ec5\u5bf9 SOQL \u5b50\u53e5\u4e2d\u5f15\u7528\u7684\u5b57\u6bb5\u548c\u5bf9\u8c61\u8fdb\u884c\u68c0\u67e5 \u800c\u4e0d\u662f\u50cf \u6216 \u8fd9\u6837\u7684\u5b50\u53e5\u3002\u6362\u8a00\u4e4b\uff0c\u5b89\u5168\u6027\u662f\u9488\u5bf9\u67e5\u8be2\u8fd4\u56de\u7684\u5185\u5bb9\u5f3a\u5236\u5b9e\u65bd\u7684\uff0c\u800c\u4e0d\u662f\u9488\u5bf9\u8fdb\u5165\u7684\u6240\u6709\u5143\u7d20 \u8fd0\u884c\u67e5\u8be2\u3002<samp>SELECT<\/samp><samp>FROM<\/samp><samp>WHERE<\/samp><samp>ORDER BY<\/samp><samp>SOQL SELECT<\/samp>\u63d2\u5165\u5b50\u53e5\uff1a<\/p>\n\n\n\n<p><samp>WITH SECURITY_ENFORCED<\/samp><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5982\u679c\u5b58\u5728\uff0c\u5219\u5728\u5b50\u53e5\u4e4b\u540e\uff0c\u5426\u5219\u5728\u5b50\u53e5\u4e4b\u540e\u3002<samp>WHERE<\/samp><samp>FROM<\/samp><\/li>\n\n\n\n<li>\u5728\u4efb\u4f55 \u3001 \u3001 \u6216\u805a\u5408\u51fd\u6570\u4e4b\u524d \u7b2c\u3002<samp>ORDER BY<\/samp><samp>LIMIT<\/samp><samp>OFFSET<\/samp><\/li>\n<\/ul>\n\n\n\n<p>\u6709\u5173\u67e5\u8be2\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605 SOQL \u548c SOSL \u4e2d\u7684&nbsp;SOQL SELECT \u8bed\u6cd5&nbsp;\u53c2\u8003\u3002<\/p>\n\n\n\n<p><samp>SOQL SELECT<\/samp>\u4f8b\u5982\uff0c\u5982\u679c\u7528\u6237\u5177\u6709 LastName \u7684\u5b57\u6bb5\u8bbf\u95ee\u6743\u9650\uff0c\u5219\u6b64\u67e5\u8be2\u5c06\u8fd4\u56de Id \u548c LastName \u7528\u4e8e Acme \u5e10\u6237\u6761\u76ee\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>List&lt;Account&gt; act1 = &#91;SELECT Id, (SELECT LastName FROM Contacts)\n   FROM Account WHERE Name like 'Acme' WITH SECURITY_ENFORCED]<\/code><\/pre>\n\n\n\n<p>\u4f7f\u7528 \u67e5\u8be2\u591a\u6001\u67e5\u627e\u5b57\u6bb5\u65f6\u5b58\u5728\u4e00\u4e9b\u9650\u5236\u3002\u591a\u6001\u573a\u662f\u5173\u7cfb \u53ef\u4ee5\u6307\u5411\u591a\u4e2a\u5b9e\u4f53\u7684\u5b57\u6bb5\u3002<\/p>\n\n\n\n<p><samp>WITH SECURITY_ENFORCED<\/samp><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5728\u4f7f\u7528 \u7684\u67e5\u8be2\u4e2d\u4e0d\u652f\u6301\u904d\u5386\u591a\u6001\u5b57\u6bb5\u7684\u5173\u7cfb\u3002\u4f8b\u5982\uff0c\u60a8\u4e0d\u80fd\u5728\u6b64\u67e5\u8be2\u4e2d\u4f7f\u7528 \u8fd4\u56de User \u548c Calendar \u5b9e\u4f53\u7684 Id \u548c Owner \u540d\u79f0\uff1a\u3002<samp>WITH SECURITY_ENFORCED<\/samp><samp>WITH SECURITY_ENFORCED<\/samp><samp>SELECT Id, What.Name FROM Event WHERE What.Type IN (\u2019User\u2019,\u2019Calendar\u2019)<\/samp><\/li>\n\n\n\n<li>\u5728\u4f7f\u7528 \u7684\u67e5\u8be2\u4e2d\u4e0d\u652f\u6301\u5c06\u8868\u8fbe\u5f0f\u4e0e\u5b50\u53e5\u4e00\u8d77\u4f7f\u7528\u3002 \u5728 SELECT \u67e5\u8be2\u4e2d\u7528\u4e8e\u6307\u5b9a\u8981\u4e3a \u7ed9\u5b9a\u591a\u6001\u5173\u7cfb\u7684\u7c7b\u578b\u3002\u4f8b\u5982\uff0c\u4e0d\u80fd\u5728\u6b64\u67e5\u8be2\u4e2d\u4f7f\u7528\u3002\u67e5\u8be2 \u6307\u5b9a\u8981\u4e3a Account \u548c Opportunity \u5bf9\u8c61\u8fd4\u56de\u7684\u67d0\u4e9b\u5b57\u6bb5\uff0c\u4ee5\u53ca Name \u548c \u8981\u4e3a\u6240\u6709\u5176\u4ed6\u5bf9\u8c61\u8fd4\u56de\u7684\u7535\u5b50\u90ae\u4ef6\u5b57\u6bb5\u3002<samp>TYPEOF<\/samp><samp>ELSE<\/samp><samp>WITH SECURITY_ENFORCED<\/samp><samp>TYPEOF<\/samp><samp>WITH SECURITY_ENFORCED<\/samp><code>SELECT TYPE OF What WHEN Account THEN Phone WHEN Opportunity THEN Amount ELSE Name,Email END FROM Event<\/code><\/li>\n\n\n\n<li>\u3001 \u548c \u591a\u6001\u67e5\u627e\u5b57\u6bb5\u4e0d\u53d7\u6b64\u9650\u5236\uff0c\u5e76\u4e14\u5141\u8bb8\u591a\u6001 \u5173\u7cfb\u904d\u5386\u3002<samp>Owner<\/samp><samp>CreatedBy<\/samp><samp>LastModifiedBy<\/samp><\/li>\n\n\n\n<li>\u5bf9\u4e8e AppExchange Security Review\uff0c\u5728\u4f7f\u7528 \u65f6\u5fc5\u987b\u4f7f\u7528 API \u7248\u672c 48.0 \u6216\u66f4\u9ad8\u7248\u672c\u3002\u4e0d\u80fd\u4f7f\u7528 API \u8be5\u529f\u80fd\u5904\u4e8e\u6d4b\u8bd5\u7248\u6216\u8bd5\u70b9\u9636\u6bb5\u7684\u7248\u672c\u3002<samp>WITH SECURITY_ENFORCED<\/samp><\/li>\n<\/ul>\n\n\n\n<p>\u5982\u679c\u67e5\u8be2\u4e2d\u5f15\u7528\u7684\u4efb\u4f55\u5b57\u6bb5\u6216\u5bf9\u8c61\u65e0\u6cd5\u8bbf\u95ee \u7528\u6237\uff0ca \u88ab\u629b\u51fa\uff0c\u6ca1\u6709 \u8fd4\u56de\u6570\u636e\u3002<samp>SOQL SELECT<\/samp><samp>WITH SECURITY_ENFORCED<\/samp><samp>System.QueryException<\/samp><\/p>\n\n\n\n<p>\u5bf9 User \u5bf9\u8c61\u5f3a\u5236\u5b9e\u65bd\u5bf9\u8c61\u548c\u5b57\u6bb5\u6743\u9650\u5e76\u9690\u85cf\u7528\u6237\u7684\u4e2a\u4eba \u6765\u81ea\u5177\u6709 Experience Cloud \u7ad9\u70b9\u7684\u7ec4\u7ec7\u4e2d\u5176\u4ed6\u7528\u6237\u7684\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605\u5f3a\u5236\u6267\u884c\u5bf9\u8c61\u548c\u5b57\u6bb5\u6743\u9650\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u4f8b<\/h2>\n\n\n\n<p>\u5982\u679c\u9690\u85cf\u4e86 LastName \u6216 Description \u7684\u5b57\u6bb5\u8bbf\u95ee\u6743\u9650\uff0c\u5219\u6b64\u67e5\u8be2\u5c06\u5f15\u53d1 \u6307\u793a\u6743\u9650\u4e0d\u8db3\u7684\u5f02\u5e38\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>List&lt;Account&gt; act1 = &#91;SELECT Id, (SELECT LastName FROM Contacts), \n   (SELECT Description FROM Opportunities)\n   FROM Account WITH SECURITY_ENFORCED]<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u4f8b<\/h2>\n\n\n\n<p>\u5982\u679c\u201c\u7f51\u7ad9\u201d\u7684\u5b57\u6bb5\u8bbf\u95ee\u5904\u4e8e\u9690\u85cf\u72b6\u6001\uff0c\u5219\u6b64\u67e5\u8be2\u5c06\u5f15\u53d1\u5f02\u5e38\uff0c\u6307\u793a \u6743\u9650\u4e0d\u8db3\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>List&lt;Account&gt; act2 = &#91;SELECT Id, parent.Name, parent.Website \n   FROM Account WITH SECURITY_ENFORCED]<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u4f8b<\/h2>\n\n\n\n<p>\u5982\u679c\u9690\u85cf\u4e86 Type \u7684\u5b57\u6bb5\u8bbf\u95ee\uff0c\u5219\u6b64\u805a\u5408\u51fd\u6570\u67e5\u8be2\u5c06\u5f15\u53d1\u5f02\u5e38 \u8868\u793a\u6743\u9650\u4e0d\u8db3\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>List&lt;AggregateResult&gt; agr1 = &#91;SELECT GROUPING(Type) \n   FROM Opportunity WITH SECURITY_ENFORCED \n   GROUP BY Type]<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u7c7b\u5b89\u5168\u6027<\/h2>\n\n\n\n<p>\u60a8\u53ef\u4ee5\u6307\u5b9a\u54ea\u4e9b\u7528\u6237\u53ef\u4ee5\u6839\u636e\u5176 \u7528\u6237\u914d\u7f6e\u6587\u4ef6\u6216\u6743\u9650\u96c6\u3002\u60a8\u53ea\u80fd\u5728 Apex \u7c7b\u4e0a\u8bbe\u7f6e\u5b89\u5168\u6027\uff0c\u800c\u4e0d\u80fd\u5728\u89e6\u53d1\u5668\u4e0a\u8bbe\u7f6e\u5b89\u5168\u6027\u3002<\/p>\n\n\n\n<p>\u8981\u4ece\u7c7b\u5217\u8868\u9875\u9762\u8bbe\u7f6e Apex \u7c7b\u5b89\u5168\u6027\uff0c\u8bf7\u53c2\u9605\u4ece\u7c7b\u5217\u8868\u8bbe\u7f6e Apex \u7c7b\u8bbf\u95ee\u6743\u9650 \u9875<\/p>\n\n\n\n<p>\u8981\u4ece\u7c7b\u8be6\u7ec6\u4fe1\u606f\u9875\u9762\u8bbe\u7f6e Apex \u7c7b\u5b89\u5168\u6027\uff0c\u8bf7\u53c2\u9605\u4ece\u7c7b\u5217\u8868\u4e2d\u8bbe\u7f6e Apex \u7c7b\u8bbf\u95ee\u6743\u9650 \u9875<\/p>\n\n\n\n<p>\u8981\u4ece\u6743\u9650\u96c6\u8bbe\u7f6e Apex \u7c7b\u5b89\u5168\u6027\uff0c\u8bf7\u6267\u884c\u4ee5\u4e0b\u64cd\u4f5c\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5728\u201c\u8bbe\u7f6e\u201d\u4e2d\uff0c\u8f93\u5165\u201c\u5feb\u901f\u201d \u201c\u67e5\u627e\u201d\u6846\uff0c\u7136\u540e\u9009\u62e9<strong>\u201c\u6743\u9650\u96c6<\/strong>\u201d\u3002<kbd>Permission Sets<\/kbd><\/li>\n\n\n\n<li>\u9009\u62e9\u6743\u9650\u96c6\u3002<\/li>\n\n\n\n<li>\u5355\u51fb&nbsp;<strong>Apex \u7c7b\u8bbf\u95ee<\/strong>\u3002<\/li>\n\n\n\n<li>\u5355\u51fb<strong>\u7f16\u8f91<\/strong>\u3002<\/li>\n\n\n\n<li>\u4ece\u201c\u53ef\u7528\u7684 Apex \u7c7b\u201d\u5217\u8868\u4e2d\u9009\u62e9\u8981\u542f\u7528\u7684 Apex \u7c7b\uff0c\u7136\u540e \u5355\u51fb<strong>\u201c\u6dfb\u52a0<\/strong>\u201d\uff0c\u6216\u4ece \u201c\u5df2\u542f\u7528 Apex \u7c7b\u201d\u5217\u8868\uff0c\u7136\u540e\u5355\u51fb<strong>\u201c\u5220\u9664<\/strong>\u201d\u3002<\/li>\n\n\n\n<li>\u70b9\u51fb<strong>\u4fdd\u5b58<\/strong>\u3002<\/li>\n<\/ol>\n\n\n\n<p>\u8981\u4ece\u914d\u7f6e\u6587\u4ef6\u8bbe\u7f6e Apex \u7c7b\u5b89\u5168\u6027\uff0c\u8bf7\u6267\u884c\u4ee5\u4e0b\u64cd\u4f5c\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5728\u201c\u8bbe\u7f6e\u201d\u4e2d\uff0c\u5728\u201c\u5feb\u901f\u67e5\u627e\u201d\u6846\u4e2d\u8f93\u5165\uff0c \uff0c\u7136\u540e\u9009\u62e9<strong>\u914d\u7f6e\u6587\u4ef6<\/strong>\u3002<kbd>Profiles<\/kbd><\/li>\n\n\n\n<li>\u9009\u62e9\u914d\u7f6e\u6587\u4ef6\u3002<\/li>\n\n\n\n<li>\u5728\u201cApex \u7c7b\u8bbf\u95ee\u201d\u9875\u9762\u6216\u76f8\u5173\u5217\u8868\u4e2d\uff0c\u5355\u51fb<strong>\u201c\u7f16\u8f91<\/strong>\u201d\u3002<\/li>\n\n\n\n<li>\u4ece\u201c\u53ef\u7528\u7684 Apex \u7c7b\u201d\u5217\u8868\u4e2d\u9009\u62e9\u8981\u542f\u7528\u7684 Apex \u7c7b\uff0c\u7136\u540e \u5355\u51fb<strong>\u201c\u6dfb\u52a0<\/strong>\u201d\uff0c\u6216\u4ece \u201c\u5df2\u542f\u7528 Apex \u7c7b\u201d\u5217\u8868\uff0c\u7136\u540e\u5355\u51fb<strong>\u201c\u5220\u9664<\/strong>\u201d\u3002<\/li>\n\n\n\n<li>\u70b9\u51fb<strong>\u4fdd\u5b58<\/strong>\u3002<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e86\u89e3 Apex \u6258\u7ba1\u5171\u4eab<\/h2>\n\n\n\n<p><dfn>\u5171\u4eab<\/dfn>\u662f\u6388\u4e88\u7528\u6237\u6216\u7528\u6237\u7ec4\u6743\u9650\u7684\u884c\u4e3a \u5bf9\u4e00\u6761\u8bb0\u5f55\u6216\u4e00\u7ec4\u8bb0\u5f55\u6267\u884c\u4e00\u7ec4\u64cd\u4f5c\u3002\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u6388\u4e88\u5171\u4eab\u8bbf\u95ee\u6743\u9650 Salesforce \u7528\u6237\u754c\u9762\u548c Lightning Platform\uff0c\u6216\u4ee5\u7f16\u7a0b\u65b9\u5f0f\u4f7f\u7528 \u9876\u70b9\u3002<\/p>\n\n\n\n<p>\u6709\u5173\u5171\u4eab\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605\u8bbe\u7f6e\u5185\u90e8\u7ec4\u7ec7\u8303\u56f4\u7684\u5171\u4eab&nbsp;Salesforce \u8054\u673a\u5e2e\u52a9\u4e2d\u7684\u9ed8\u8ba4\u503c\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u4e86\u89e3\u5171\u4eab \u5171\u4eab<\/strong><br>\u652f\u6301\u5bf9\u6240\u6709\u81ea\u5b9a\u4e49\u5bf9\u8c61\u4ee5\u53ca\u8bb8\u591a\u6807\u51c6\u5bf9\u8c61\uff08\u5982\u5ba2\u6237\u3001\u8054\u7cfb\u4eba\u3001\u5546\u673a\u548c\u6848\u4f8b\uff09\u8fdb\u884c\u8bb0\u5f55\u7ea7\u8bbf\u95ee\u63a7\u5236\u3002\u7ba1\u7406\u5458\u9996\u5148\u8bbe\u7f6e\u5bf9\u8c61\u7684\u7ec4\u7ec7\u8303\u56f4\u9ed8\u8ba4\u5171\u4eab\u8bbf\u95ee\u7ea7\u522b\uff0c\u7136\u540e\u6839\u636e\u8bb0\u5f55\u6240\u6709\u6743\u3001\u89d2\u8272\u5c42\u6b21\u7ed3\u6784\u3001\u5171\u4eab\u89c4\u5219\u548c\u624b\u52a8\u5171\u4eab\u6388\u4e88\u5176\u4ed6\u8bbf\u95ee\u6743\u9650\u3002\u7136\u540e\uff0c\u5f00\u53d1\u4eba\u5458\u53ef\u4ee5\u4f7f\u7528 Apex \u6258\u7ba1\u5171\u4eab\u4ee5\u7f16\u7a0b\u65b9\u5f0f\u6388\u4e88 Apex \u7684\u989d\u5916\u8bbf\u95ee\u6743\u9650\u3002<\/li>\n\n\n\n<li><strong>\u4f7f\u7528 Apex \u5171\u4eab\u8bb0\u5f55<\/strong><\/li>\n\n\n\n<li><strong>\u91cd\u65b0\u8ba1\u7b97 Apex \u6258\u7ba1\u5171\u4eab<\/strong><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e86\u89e3\u5171\u4eab<\/h2>\n\n\n\n<p><dfn>\u5171\u4eab<\/dfn>\u652f\u6301\u5bf9\u6240\u6709\u81ea\u5b9a\u4e49\u5bf9\u8c61\u8fdb\u884c\u8bb0\u5f55\u7ea7\u8bbf\u95ee\u63a7\u5236\uff0c\u56e0\u4e3a \u4ee5\u53ca\u8bb8\u591a\u6807\u51c6\u5bf9\u8c61\uff08\u4f8b\u5982 Account\u3001Contact\u3001Opportunity \u548c Case\uff09\u3002 \u7ba1\u7406\u5458\u9996\u5148\u8bbe\u7f6e\u5bf9\u8c61\u7684\u7ec4\u7ec7\u8303\u56f4\u9ed8\u8ba4\u5171\u4eab\u8bbf\u95ee\u7ea7\u522b\uff0c \u7136\u540e\u6839\u636e\u8bb0\u5f55\u6240\u6709\u6743\u3001\u89d2\u8272\u5c42\u6b21\u7ed3\u6784\u3001\u5171\u4eab\u6388\u4e88\u5176\u4ed6\u8bbf\u95ee\u6743\u9650 \u89c4\u5219\u548c\u624b\u52a8\u5171\u4eab\u3002\u7136\u540e\uff0c\u5f00\u53d1\u4eba\u5458\u53ef\u4ee5\u4f7f\u7528 Apex \u6258\u7ba1\u5171\u4eab\u6765\u6388\u4e88\u5176\u4ed6 \u4f7f\u7528 Apex \u4ee5\u7f16\u7a0b\u65b9\u5f0f\u8bbf\u95ee\u3002<\/p>\n\n\n\n<p>\u8bb0\u5f55\u7684\u5927\u591a\u6570\u5171\u4eab\u90fd\u7ef4\u62a4\u5728\u76f8\u5173\u7684\u5171\u4eab\u5bf9\u8c61\u4e2d\uff0c\u7c7b\u4f3c\u4e8e\u8bbf\u95ee \u5728\u5176\u4ed6\u5e73\u53f0\u4e2d\u627e\u5230\u7684\u63a7\u5236\u5217\u8868 \uff08ACL\uff09\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a><\/a>\u5171\u4eab\u7c7b\u578b<\/h2>\n\n\n\n<p>Salesforce \u5177\u6709\u4ee5\u4e0b\u7c7b\u578b\u7684\u5171\u4eab\uff1a\u6258\u7ba1\u5171\u4eab\u6258\u7ba1\u5171\u4eab\u6d89\u53ca Lightning \u5e73\u53f0\u6388\u4e88\u7684\u5171\u4eab\u8bbf\u95ee\u6743\u9650 \u57fa\u4e8e\u8bb0\u5f55\u6240\u6709\u6743\u3001\u89d2\u8272\u5c42\u6b21\u7ed3\u6784\u548c\u5171\u4eab\u89c4\u5219\uff1a\u8bb0\u5f55\u6240\u6709\u6743\u6bcf\u6761\u8bb0\u5f55\u90fd\u7531\u4e00\u4e2a\u7528\u6237\u62e5\u6709\uff0c\u6216\u8005\u7531\u4e00\u4e2a\u961f\u5217\uff08\u53ef\u9009\uff09\u62e5\u6709 \u81ea\u5b9a\u4e49\u5bf9\u8c61\u3001\u6848\u4f8b\u548c\u6f5c\u5728\u5ba2\u6237\u3002<dfn>\u8bb0\u5f55 \u6240\u6709\u8005<\/dfn>\u88ab\u81ea\u52a8\u6388\u4e88\u5b8c\u5168\u8bbf\u95ee\u6743\u9650\uff0c \u5141\u8bb8\u4ed6\u4eec\u67e5\u770b\u3001\u7f16\u8f91\u3001\u4f20\u8f93\u3001\u5171\u4eab\u548c\u5220\u9664 \u8bb0\u5f55\u3002\u89d2\u8272\u5c42\u6b21\u7ed3\u6784<dfn>\u89d2\u8272\u5c42\u6b21\u7ed3\u6784<\/dfn>\u5141\u8bb8\u4e0a\u8ff0\u7528\u6237 \u5c42\u6b21\u7ed3\u6784\u4e2d\u7684\u53e6\u4e00\u4e2a\u7528\u6237\u5177\u6709\u76f8\u540c\u7ea7\u522b\u7684 \u8bbf\u95ee\u4ee5\u4e0b\u7528\u6237\u62e5\u6709\u6216\u4e0e\u7528\u6237\u5171\u4eab\u7684\u8bb0\u5f55\u3002 \u56e0\u6b64\uff0c\u89d2\u8272\u4e2d\u9ad8\u4e8e\u8bb0\u5f55\u6240\u6709\u8005\u7684\u7528\u6237 \u5c42\u6b21\u7ed3\u6784\u4e5f\u88ab\u9690\u5f0f\u6388\u4e88\u5bf9 \u8bb0\u5f55\uff0c\u4f46\u53ef\u4ee5\u7981\u7528\u6b64\u884c\u4e3a \u7279\u5b9a\u7684\u81ea\u5b9a\u4e49\u5bf9\u8c61\u3002\u89d2\u8272\u5c42\u6b21\u7ed3\u6784\u4e0d\u662f \u901a\u8fc7\u5171\u4eab\u8bb0\u5f55\u8fdb\u884c\u7ef4\u62a4\u3002\u76f8\u53cd\uff0c\u89d2\u8272\u5c42\u6b21\u7ed3\u6784 \u8bbf\u95ee\u662f\u5728\u8fd0\u884c\u65f6\u6d3e\u751f\u7684\u3002\u6709\u5173\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605 \u3002 \u201c\u4f7f\u7528\u5c42\u6b21\u7ed3\u6784\u63a7\u5236\u8bbf\u95ee\u201d\u4e2d\u7684 Salesforce \u8054\u673a\u5e2e\u52a9\u3002\u5171\u4eab\u89c4\u5219\u7ba1\u7406\u5458\u4f7f\u7528<dfn>\u5171\u4eab\u89c4\u5219<\/dfn>\u6765 \u81ea\u52a8\u6388\u4e88\u7ed9\u5b9a\u7ec4\u6216\u89d2\u8272\u4e2d\u7684\u7528\u6237\u6743\u9650 \u8bbf\u95ee\u7279\u5b9a\u7528\u6237\u7ec4\u62e5\u6709\u7684\u8bb0\u5f55\u3002\u65e0\u6cd5\u5c06\u5171\u4eab\u89c4\u5219\u6dfb\u52a0\u5230 package\uff0c\u4e0d\u80fd\u7528\u4e8e\u652f\u6301\u5171\u4eab\u903b\u8f91 \u5bf9\u4e8e\u4ece AppExchange \u5b89\u88c5\u7684\u5e94\u7528\u7a0b\u5e8f\u3002<\/p>\n\n\n\n<p>\u5171\u4eab \u89c4\u5219\u53ef\u4ee5\u57fa\u4e8e\u8bb0\u5f55\u6240\u6709\u6743\u6216\u5176\u4ed6 \u6807\u51c6\u3002\u60a8\u4e0d\u80fd\u4f7f\u7528 Apex \u521b\u5efa \u57fa\u4e8e\u6761\u4ef6\u7684\u5171\u4eab\u89c4\u5219\u3002\u6b64\u5916\uff0c\u57fa\u4e8e\u6807\u51c6 \u65e0\u6cd5\u4f7f\u7528 Apex \u6d4b\u8bd5\u5171\u4eab\u3002<\/p>\n\n\n\n<p>Force.com \u6258\u7ba1\u5171\u4eab\u6dfb\u52a0\u7684\u6240\u6709\u9690\u5f0f\u5171\u4eab\u90fd\u4e0d\u80fd\u662f \u4f7f\u7528 Salesforce \u7528\u6237\u754c\u9762\u3001SOAP API \u76f4\u63a5\u66f4\u6539\uff0c\u6216\u8005 \u9876\u70b9\u3002\u7528\u6237\u7ba1\u7406\u5171\u4eab\uff0c\u4e5f\u79f0\u4e3a\u624b\u52a8\u5171\u4eab\u7528\u6237\u7ba1\u7406\u7684\u5171\u4eab\u5141\u8bb8\u8bb0\u5f55\u6240\u6709\u8005\u6216\u5177\u6709\u201c\u5b8c\u6574\u201d\u7684\u4efb\u4f55\u7528\u6237 \u8bbf\u95ee\u8bb0\u5f55\u4ee5\u4e0e\u7528\u6237\u6216\u7528\u6237\u7ec4\u5171\u4eab\u8bb0\u5f55\u3002 \u5bf9\u4e8e\u5355\u4e2a\u8bb0\u5f55\uff0c\u8fd9\u901a\u5e38\u7531\u6700\u7ec8\u7528\u6237\u5b8c\u6210\u3002\u53ea\u6709 \u6388\u4e88\u8bb0\u5f55\u6240\u6709\u8005\u548c\u89d2\u8272\u5c42\u6b21\u7ed3\u6784\u4e2d\u6240\u6709\u8005\u4e4b\u4e0a\u7684\u7528\u6237 \u5bf9\u8bb0\u5f55\u7684\u5b8c\u5168\u8bbf\u95ee\u6743\u9650\u3002\u65e0\u6cd5\u6388\u4e88\u5176\u4ed6\u7528\u6237\u201c\u5b8c\u5168\u201d\u6743\u9650 \u8bbf\u95ee\u3002\u5177\u6709\u201c\u5168\u90e8\u4fee\u6539\u201d\u5bf9\u8c61\u7ea7\u522b\u7684\u7528\u6237 \u7ed9\u5b9a\u5bf9\u8c61\u6216\u201c\u4fee\u6539\u6240\u6709\u6570\u636e\u201d\u7684\u6743\u9650 \u6743\u9650\u4e5f\u53ef\u4ee5\u624b\u52a8\u5171\u4eab\u8bb0\u5f55\u3002\u7528\u6237\u7ba1\u7406\u7684\u5171\u4eab\u662f \u5f53\u8bb0\u5f55\u6240\u6709\u8005\u53d1\u751f\u66f4\u6539\u6216\u5728 \u5171\u4eab\u4e0d\u4f1a\u6388\u4e88\u5bf9\u8c61\u4ee5\u5916\u7684\u5176\u4ed6\u8bbf\u95ee\u6743\u9650 \u7ec4\u7ec7\u8303\u56f4\u7684\u5171\u4eab\u9ed8\u8ba4\u8bbf\u95ee\u7ea7\u522b\u3002Apex \u6258\u7ba1\u5171\u4eabApex \u6258\u7ba1\u5171\u4eab\u4f7f\u5f00\u53d1\u4eba\u5458\u80fd\u591f\u652f\u6301 \u4ee5\u7f16\u7a0b\u65b9\u5f0f\u6ee1\u8db3\u5e94\u7528\u7a0b\u5e8f\u7684\u7279\u5b9a\u5171\u4eab\u8981\u6c42 \u901a\u8fc7 Apex \u6216 SOAP API\u3002<a><\/a>\u8fd9\u79cd\u7c7b\u578b\u7684 \u5171\u4eab\u7c7b\u4f3c\u4e8e\u6258\u7ba1\u5171\u4eab\u3002\u4ec5\u9650\u5177\u6709 \u201c\u4fee\u6539\u6240\u6709\u6570\u636e\u201d\u6743\u9650\u53ef\u4ee5\u6dfb\u52a0\u6216\u66f4\u6539 Apex \u8bb0\u5f55\u4e0a\u7684\u6258\u7ba1\u5171\u4eab\u3002\u7ef4\u62a4 Apex \u6258\u7ba1\u5171\u4eab \u8de8\u8bb0\u5f55\u6240\u6709\u8005\u66f4\u6539\u3002<\/p>\n\n\n\n<p>\u6ce8\u610f<\/p>\n\n\n\n<p>Apex \u5171\u4eab\u539f\u56e0\u548c Apex \u6258\u7ba1 \u5171\u4eab\u91cd\u65b0\u8ba1\u7b97\u4ec5\u9002\u7528\u4e8e\u81ea\u5b9a\u4e49\u5bf9\u8c61\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a><\/a>\u5206\u4eab\u539f\u56e0 \u7530<\/h2>\n\n\n\n<p>\u5728 Salesforce \u7528\u6237\u754c\u9762\uff0c\u81ea\u5b9a\u4e49\u5bf9\u8c61\u4e0a\u7684\u201c\u539f\u56e0\u201d\u5b57\u6bb5 \u6307\u5b9a\u7528\u4e8e\u8bb0\u5f55\u7684\u5171\u4eab\u7c7b\u578b\u3002\u6b64\u5b57\u6bb5\u5728 Apex \u6216 API \u4e2d\u8c03\u7528\u3002<samp>rowCause<\/samp>\u6bcf\u4e2a \u4ee5\u4e0b\u5217\u8868\u9879\u662f\u4e00\u79cd\u7528\u4e8e\u8bb0\u5f55\u7684\u5171\u4eab\u7c7b\u578b\u3002\u8fd9\u4e9b\u8868\u663e\u793a\u201c\u539f\u56e0\u201d\u5b57\u6bb5\u503c\u548c\u76f8\u5173\u503c\u3002<\/p>\n\n\n\n<p><samp>rowCause<\/samp><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6258\u7ba1\u5171\u4eabReason Field&nbsp;Value<samp>rowCause<\/samp>&nbsp;Value (Used in Apex or the API)Account Sharing<samp>ImplicitChild<\/samp>Associated record owner or sharing<samp>ImplicitParent<\/samp>Owner<samp>Owner<\/samp>Opportunity Team<samp>Team<\/samp>Sharing Rule<samp>Rule<\/samp>\u533a\u57df\u5206\u914d\u89c4\u5219<samp>TerritoryRule<\/samp><\/li>\n\n\n\n<li>\u7528\u6237\u7ba1\u7406\u5171\u4eab\u539f\u56e0\u5b57\u6bb5\u4ef7\u503c<samp>rowCause<\/samp>\u503c\uff08\u5728 Apex \u6216 API \u4e2d\u4f7f\u7528\uff09\u624b\u52a8\u5171\u4eab<samp>Manual<\/samp>\u9886\u5730\u624b\u518c<samp>TerritoryManual<\/samp>\u6ce8\u610f\u4f7f\u7528\u4f01\u4e1a API \u7248\u672c 45.0 \u53ca\u66f4\u9ad8\u7248\u672c\u4e2d\u7684 Territory Management \u53d6\u4ee3\u4e86 .<samp>Territory2AssociationManual<\/samp><samp>TerritoryManual<\/samp><\/li>\n\n\n\n<li>Apex \u6258\u7ba1\u5171\u4eab\u539f\u56e0\u5b57\u6bb5\u4ef7\u503c<samp>rowCause<\/samp>\u503c\uff08\u5728 Apex \u6216 API \u4e2d\u4f7f\u7528\uff09\u7531\u5f00\u53d1\u4eba\u5458\u5b9a\u4e49\u7531\u5f00\u53d1\u4eba\u5458\u5b9a\u4e49<\/li>\n<\/ul>\n\n\n\n<p>Apex \u6258\u7ba1\u5171\u4eab\u7684\u663e\u793a\u539f\u56e0\u7531 \u5f00\u53d1 \u4eba\u5458\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a><\/a>\u8bbf\u95ee \u6c34\u5e73<\/h2>\n\n\n\n<p>\u5728\u786e\u5b9a\u7528\u6237\u5bf9 \u8bb0\u5f55\uff0c\u5219\u4f7f\u7528\u6700\u5bbd\u677e\u7684\u8bbf\u95ee\u7ea7\u522b\u3002\u5927\u591a\u6570\u5171\u4eab\u5bf9\u8c61\u90fd\u652f\u6301 \u4ee5\u4e0b\u8bbf\u95ee\u7ea7\u522b\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u8bbf\u95ee\u7ea7\u522b<\/th><th>API \u540d\u79f0<\/th><th>\u63cf\u8ff0<\/th><\/tr><\/thead><tbody><tr><td>\u79c1\u4eba<\/td><td>\u6ca1\u6709<\/td><td>\u53ea\u6709\u8bb0\u5f55\u6240\u6709\u8005\u548c\u8bb0\u5f55\u6240\u6709\u8005\u4e4b\u4e0a\u7684\u7528\u6237 \u89d2\u8272\u5c42\u6b21\u7ed3\u6784\u53ef\u4ee5\u67e5\u770b\u548c\u7f16\u8f91\u8bb0\u5f55\u3002\u4ec5\u9650\u6b64\u8bbf\u95ee\u7ea7\u522b \u5e94\u7528\u4e8e AccountShare \u5bf9\u8c61\u3002<\/td><\/tr><tr><td>\u53ea\u8bfb<\/td><td>\u8bfb<\/td><td>\u6307\u5b9a\u7684\u7528\u6237\u6216\u7ec4\u53ea\u80fd\u67e5\u770b\u8bb0\u5f55\u3002<\/td><\/tr><tr><td>\u8bfb\/\u5199<\/td><td>\u7f16\u8f91<\/td><td>\u6307\u5b9a\u7684\u7528\u6237\u6216\u7ec4\u53ef\u4ee5\u67e5\u770b\u548c\u7f16\u8f91\u8bb0\u5f55\u3002<\/td><\/tr><tr><td>\u5b8c\u5168\u8bbf\u95ee\u6743\u9650<\/td><td>\u90fd<\/td><td>\u6307\u5b9a\u7684\u7528\u6237\u6216\u7ec4\u53ef\u4ee5\u67e5\u770b\u3001\u7f16\u8f91\u3001\u4f20\u8f93\u3001\u5171\u4eab\u548c \u5220\u9664\u8bb0\u5f55\u3002\u6ce8\u610f\u6b64\u8bbf\u95ee\u7ea7\u522b\u53ea\u80fd\u6388\u4e88 \u6258\u7ba1\u5171\u4eab\u3002<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\u5206\u4eab\u6ce8\u610f\u4e8b\u9879<\/h2>\n\n\n\n<p>Apex \u89e6\u53d1\u5668\u548c\u7528\u6237\u8bb0\u5f55\u5171\u4eab\u5982\u679c\u89e6\u53d1\u5668\u66f4\u6539\u4e86\u8bb0\u5f55\u7684\u6240\u6709\u8005\uff0c\u5219\u6b63\u5728\u8fd0\u884c\u7684\u7528\u6237\u5fc5\u987b\u5df2\u8bfb\u53d6 \u5982\u679c\u89e6\u53d1\u5668\u662f\u901a\u8fc7 \u4ee5\u540e\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5e94\u7528\u7a0b\u5e8f\u63a5\u53e3<\/li>\n\n\n\n<li>\u6807\u51c6\u7528\u6237\u754c\u9762<\/li>\n\n\n\n<li>\u6807\u51c6 Visualforce \u63a7\u5236\u5668<\/li>\n\n\n\n<li>\u4f7f\u7528\u5173\u952e\u5b57\u5b9a\u4e49\u7684\u7c7b<samp>with sharing<\/samp><\/li>\n<\/ul>\n\n\n\n<p>\u5982\u679c\u89e6\u53d1\u5668\u662f\u901a\u8fc7\u672a\u4f7f\u7528\u5173\u952e\u5b57\u5b9a\u4e49\u7684\u7c7b\u542f\u52a8\u7684\uff0c\u5219\u89e6\u53d1\u5668\u5c06\u5728 \u7cfb\u7edf\u6a21\u5f0f\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u89e6\u53d1\u5668\u4e0d\u9700\u8981\u6b63\u5728\u8fd0\u884c\u7684\u7528\u6237 \u5177\u6709\u7279\u5b9a\u8bbf\u95ee\u6743\u9650\u3002<samp>with sharing<\/samp><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u4f7f\u7528 Apex \u5171\u4eab\u8bb0\u5f55<\/h2>\n\n\n\n<p>\u91cd\u8981<\/p>\n\n\n\n<p>\u5728\u53ef\u80fd\u7684\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u66f4\u6539\u4e86\u975e\u5305\u5bb9\u6027\u6761\u6b3e\uff0c\u4ee5\u7b26\u5408\u6211\u4eec\u7684 \u5e73\u7b49\u7684\u516c\u53f8\u4ef7\u503c\u89c2\u3002\u6211\u4eec\u4fdd\u7559\u4e86\u67d0\u4e9b\u6761\u6b3e\uff0c\u4ee5\u907f\u514d\u5bf9 \u5ba2\u6237\u5b9e\u65bd\u3002<\/p>\n\n\n\n<p>\u82e5\u8981\u4ee5\u7f16\u7a0b\u65b9\u5f0f\u8bbf\u95ee\u5171\u4eab\uff0c\u5fc5\u987b\u4f7f\u7528\u4e0e \u8981\u5171\u4eab\u7684\u6807\u51c6\u5bf9\u8c61\u6216\u81ea\u5b9a\u4e49\u5bf9\u8c61\u3002\u4f8b\u5982\uff0cAccountShare \u662f Account \u5bf9\u8c61\u7684\u5171\u4eab\u5bf9\u8c61\uff0cContactShare \u662f Contact \u5bf9\u8c61\u3002\u6b64\u5916\uff0c\u6240\u6709\u81ea\u5b9a\u4e49\u5bf9\u8c61\u5171\u4eab\u5bf9\u8c61\u7684\u547d\u540d\u65b9\u5f0f\u5982\u4e0b\uff1a \u5176\u4e2d \u662f\u81ea\u5b9a\u4e49\u5bf9\u8c61\u7684\u540d\u79f0\uff1a<var>MyCustomObject<\/var><\/p>\n\n\n\n<p><var>MyCustomObject<\/var><samp>__Share<\/samp><\/p>\n\n\n\n<p>\u4e3b\u4ece\u5173\u7cfb\u7684\u7ec6\u8282\u7aef\u7684\u5bf9\u8c61\u6ca1\u6709\u5173\u8054\u7684 \u5171\u4eab\u5bf9\u8c61\u3002\u660e\u7ec6\u8bb0\u5f55\u7684\u8bbf\u95ee\u6743\u9650\u7531\u4e3b\u8282\u70b9\u7684 \u5171\u4eab\u5bf9\u8c61\u548c\u5173\u7cfb\u7684\u5171\u4eab\u8bbe\u7f6e\u3002\u6709\u5173\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605 \u3002 Salesforce \u8054\u673a\u5e2e\u52a9\u4e2d\u7684\u201c\u81ea\u5b9a\u4e49\u5bf9\u8c61\u5b89\u5168\u6027\u201d\u3002<\/p>\n\n\n\n<p>\u5171\u4eab\u5bf9\u8c61\u5305\u62ec\u652f\u6301\u6240\u6709\u4e09\u79cd\u5171\u4eab\u7c7b\u578b\u7684\u8bb0\u5f55\uff1a\u6258\u7ba1\u5171\u4eab\u3001 \u7528\u6237\u6258\u7ba1\u5171\u4eab\u548c Apex \u6258\u7ba1\u5171\u4eab\u3002\u9690\u5f0f\u6388\u4e88\u7528\u6237\u7684\u5171\u4eab \u901a\u8fc7\u7ec4\u7ec7\u8303\u56f4\u7684\u9ed8\u8ba4\u503c\u3001\u89d2\u8272\u5c42\u6b21\u7ed3\u6784\u548c\u6743\u9650\uff0c\u4f8b\u5982 \u7ed9\u5b9a\u7684\u201c\u67e5\u770b\u5168\u90e8\u201d\u548c\u201c\u5168\u90e8\u4fee\u6539\u201d\u6743\u9650 \u5bf9\u8c61\uff0c\u201c\u67e5\u770b\u6240\u6709\u6570\u636e\u201d\u548c\u201c\u4fee\u6539\u6240\u6709\u6570\u636e\u201d\u4e0d\u662f \u4f7f\u7528\u6b64\u5bf9\u8c61\u8fdb\u884c\u8ddf\u8e2a\u3002<\/p>\n\n\n\n<p>\u6bcf\u4e2a\u5171\u4eab\u5bf9\u8c61\u90fd\u5177\u6709\u4ee5\u4e0b\u5c5e\u6027\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u5c5e\u6027\u540d\u79f0<\/th><th>\u63cf\u8ff0<\/th><\/tr><\/thead><tbody><tr><td><var>objectName<\/var><samp>AccessLevel<\/samp><\/td><td>\u5df2\u6388\u4e88\u6307\u5b9a\u7528\u6237\u6216\u7ec4\u7684\u8bbf\u95ee\u7ea7\u522b \u7528\u4e8e\u5171\u4eab sObject\u3002\u5c5e\u6027\u7684\u540d\u79f0\u5c06\u8ffd\u52a0\u5230\u5bf9\u8c61 \u540d\u5b57\u3002\u4f8b\u5982\uff0cLeadShare \u5bf9\u8c61\u7684\u5c5e\u6027\u540d\u79f0\u4e3a \u3002\u6709\u6548\u503c\u4e3a\uff1a<samp>AccessLevelLeadShareAccessLevelEditReadAll<\/samp>\u6ce8\u610f\u8bbf\u95ee\u7ea7\u522b \u662f\u5185\u90e8\u503c\uff0c\u4e0d\u80fd\u6388\u4e88\u3002<samp>All<\/samp>\u6b64\u5b57\u6bb5\u5fc5\u987b\u662f \u8bbe\u7f6e\u4e3a\u9ad8\u4e8e\u7ec4\u7ec7\u7684\u8bbf\u95ee\u7ea7\u522b \u7236\u5bf9\u8c61\u7684\u9ed8\u8ba4\u8bbf\u95ee\u7ea7\u522b\u3002\u6709\u5173\u8be6\u7ec6\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605\u4e86\u89e3\u5171\u4eab\u3002<\/td><\/tr><tr><td><samp>ParentID<\/samp><\/td><td>\u5bf9\u8c61\u7684 ID\u3002\u6b64\u5b57\u6bb5\u65e0\u6cd5\u66f4\u65b0\u3002<\/td><\/tr><tr><td><samp>RowCause<\/samp><\/td><td>\u5411\u7528\u6237\u6216\u7ec4\u6388\u4e88\u8bbf\u95ee\u6743\u9650\u7684\u539f\u56e0\u3002\u539f\u56e0 \u786e\u5b9a\u5171\u4eab\u7c7b\u578b\uff0c\u63a7\u5236\u8c01\u53ef\u4ee5\u66f4\u6539\u5171\u4eab \u8bb0\u5f55\u3002\u6b64\u5b57\u6bb5\u65e0\u6cd5\u66f4\u65b0\u3002<\/td><\/tr><tr><td><samp>UserOrGroupId<\/samp><\/td><td>\u8981\u5411\u5176\u6388\u4e88\u8bbf\u95ee\u6743\u9650\u7684\u7528\u6237\u6216\u7ec4 ID\u3002\u7ec4\u53ef\u4ee5\u662f\uff1a\u4e0e\u89d2\u8272\u5173\u8054\u7684\u516c\u5171\u7ec4\u6216\u5171\u4eab\u7ec4\u3002\u533a\u57df\u7ec4\u3002\u6b64\u5b57\u6bb5\u65e0\u6cd5\u66f4\u65b0\u3002\u6ce8\u610f\u60a8\u65e0\u6cd5\u6388\u4e88\u5bf9 \u4f7f\u7528 Apex \u7684\u672a\u7ecf\u8eab\u4efd\u9a8c\u8bc1\u7684\u6765\u5bbe\u7528\u6237\u3002<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>\u60a8\u53ef\u4ee5\u4e0e\u7528\u6237\u6216\u7ec4\u5171\u4eab\u6807\u51c6\u6216\u81ea\u5b9a\u4e49\u5bf9\u8c61\u3002\u66f4\u591a\u4fe1\u606f \u6709\u5173\u53ef\u4ee5\u4e0e\u4e4b\u5171\u4eab\u5bf9\u8c61\u7684\u7528\u6237\u548c\u7ec4\u7684\u7c7b\u578b\uff0c\u8bf7\u53c2\u9605<a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.246.0.object_reference.meta\/object_reference\/sforce_api_objects_group.htm\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>\u5bf9\u8c61\u53c2\u8003\u4e2d\u7684\u201c\u7528\u6237\u548c\u7ec4\u201d Salesforce\u7684\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a><\/a>\u4f7f\u7528\u521b\u5efa\u7528\u6237\u7ba1\u7406\u7684\u5171\u4eab \u9876\u70b9<\/h2>\n\n\n\n<p>\u53ef\u4ee5\u4f7f\u7528 Apex \u6216 SOAP \u624b\u52a8\u5c06\u8bb0\u5f55\u5171\u4eab\u7ed9\u7528\u6237\u6216\u7ec4 \u5e94\u7528\u7a0b\u5e8f\u63a5\u53e3\u3002\u5982\u679c\u8bb0\u5f55\u7684\u6240\u6709\u8005\u53d1\u751f\u66f4\u6539\uff0c\u5219\u4f1a\u81ea\u52a8\u5220\u9664\u5171\u4eab\u3002\u8fd9 \u4ee5\u4e0b\u793a\u4f8b\u7c7b\u5305\u542b\u4e00\u4e2a\u5171\u4eab\u4f5c\u4e1a\u6307\u5b9a\u7684\u4f5c\u4e1a\u7684\u65b9\u6cd5 \u5177\u6709\u6307\u5b9a\u7528\u6237 ID \u7684 ID \u6216\u5177\u6709\u8bfb\u53d6\u8bbf\u95ee\u6743\u9650\u7684\u7ec4 ID\u3002\u5b83\u8fd8\u5305\u62ec\u4e00\u4e2a\u6d4b\u8bd5 \u9a8c\u8bc1\u6b64\u65b9\u6cd5\u7684\u65b9\u6cd5\u3002\u5728\u4fdd\u5b58\u6b64\u793a\u4f8b\u7c7b\u4e4b\u524d\uff0c\u8bf7\u521b\u5efa\u4e00\u4e2a \u540d\u4e3a Job \u7684\u81ea\u5b9a\u4e49\u5bf9\u8c61\u3002<\/p>\n\n\n\n<p>\u6ce8\u610f<\/p>\n\n\n\n<p>\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u4f7f\u7528 Apex \u7f16\u5199\u7684\u624b\u52a8\u5171\u4eab\u5305\u542b\u3002\u53ea \u5f53\u6240\u6709\u6743\u53d1\u751f\u66f4\u6539\u65f6\uff0c\u5c06\u5220\u9664\u5177\u6709\u6b64\u6761\u4ef6\u7684\u5171\u4eab\u3002<samp>RowCause=&#8221;Manual&#8221;<\/samp><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class JobSharing {\n   \n   public static boolean manualShareRead(Id recordId, Id userOrGroupId){\n      \/\/ Create new sharing object for the custom object Job.\n      Job__Share jobShr  = new Job__Share();\n   \n      \/\/ Set the ID of record being shared.\n      jobShr.ParentId = recordId;\n        \n      \/\/ Set the ID of user or group being granted access.\n      jobShr.UserOrGroupId = userOrGroupId;\n        \n      \/\/ Set the access level.\n      jobShr.AccessLevel = 'Read';\n        \n      \/\/ Set rowCause to 'manual' for manual sharing.\n      \/\/ This line can be omitted as 'manual' is the default value for sharing objects.\n      jobShr.RowCause = Schema.Job__Share.RowCause.Manual;\n        \n      \/\/ Insert the sharing record and capture the save result. \n      \/\/ The false parameter allows for partial processing if multiple records passed \n      \/\/ into the operation.\n      Database.SaveResult sr = Database.insert(jobShr,false);\n\n      \/\/ Process the save results.\n      if(sr.isSuccess()){\n         \/\/ Indicates success\n         return true;\n      }\n      else {\n         \/\/ Get first save result error.\n         Database.Error err = sr.getErrors()&#91;0];\n         \n         \/\/ Check if the error is related to trival access level.\n         \/\/ Access level must be more permissive than the object's default.\n         \/\/ These sharing records are not required and thus an insert exception is acceptable. \n         if(err.getStatusCode() == StatusCode.FIELD_FILTER_VALIDATION_EXCEPTION  &amp;&amp;  \n                  err.getMessage().contains('AccessLevel')){\n            \/\/ Indicates success.\n            return true;\n         }\n         else{\n            \/\/ Indicates failure.\n            return false;\n         }\n       }\n   }\n   \n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>@isTest\nprivate class JobSharingTest {\n   \/\/ Test for the manualShareRead method\n   static testMethod void testManualShareRead(){\n      \/\/ Select users for the test.\n      List&lt;User&gt; users = &#91;SELECT Id FROM User WHERE IsActive = true LIMIT 2];\n      Id User1Id = users&#91;0].Id;\n      Id User2Id = users&#91;1].Id;\n   \n      \/\/ Create new job.\n      Job__c j = new Job__c();\n      j.Name = 'Test Job';\n      j.OwnerId = user1Id;\n      insert j;    \n                \n      \/\/ Insert manual share for user who is not record owner.\n      System.assertEquals(JobSharing.manualShareRead(j.Id, user2Id), true);\n   \n      \/\/ Query job sharing records.\n      List&lt;Job__Share&gt; jShrs = &#91;SELECT Id, UserOrGroupId, AccessLevel, \n         RowCause FROM job__share WHERE ParentId = :j.Id AND UserOrGroupId= :user2Id];\n      \n      \/\/ Test for only one manual share on job.\n      System.assertEquals(jShrs.size(), 1, 'Set the object\\'s sharing model to Private.');\n      \n      \/\/ Test attributes of manual share.\n      System.assertEquals(jShrs&#91;0].AccessLevel, 'Read');\n      System.assertEquals(jShrs&#91;0].RowCause, 'Manual');\n      System.assertEquals(jShrs&#91;0].UserOrGroupId, user2Id);\n      \n      \/\/ Test invalid job Id.\n      delete j;   \n   \n      \/\/ Insert manual share for deleted job id. \n      System.assertEquals(JobSharing.manualShareRead(j.Id, user2Id), false);\n   }  \n}<\/code><\/pre>\n\n\n\n<p>\u91cd\u8981<\/p>\n\n\n\n<p>\u5bf9\u8c61\u7684\u7ec4\u7ec7\u8303\u56f4\u9ed8\u8ba4\u503c \u8bbf\u95ee\u7ea7\u522b\u4e0d\u5f97\u8bbe\u7f6e\u4e3a\u6700\u5bbd\u677e\u7684\u8bbf\u95ee\u7ea7\u522b\u3002\u5bf9\u4e8e\u5b9a\u5236 \u5bf9\u8c61\uff0c\u6b64\u7ea7\u522b\u4e3a\u516c\u5171\u8bfb\/\u5199\u3002\u6709\u5173\u8be6\u7ec6\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605\u4e86\u89e3\u5171\u4eab\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a><\/a>\u521b\u5efa Apex \u6258\u7ba1\u5171\u4eab<\/h2>\n\n\n\n<p>Apex \u6258\u7ba1\u5171\u4eab\u4f7f\u5f00\u53d1\u4eba\u5458\u80fd\u591f\u4ee5\u7f16\u7a0b\u65b9\u5f0f\u64cd\u4f5c\u5171\u4eab\uff0c\u4ee5 \u901a\u8fc7 Apex \u6216 SOAP API \u652f\u6301\u5176\u5e94\u7528\u7a0b\u5e8f\u7684\u884c\u4e3a\u3002\u6b64\u7c7b\u578b \u7684\u5171\u4eab\u7c7b\u4f3c\u4e8e\u6258\u7ba1\u5171\u4eab\u3002\u4ec5\u5177\u6709\u201c\u5168\u90e8\u4fee\u6539\u201d\u7684\u7528\u6237 \u201c\u6570\u636e\u201d\u6743\u9650\u53ef\u4ee5\u5728\u8bb0\u5f55\u4e0a\u6dfb\u52a0\u6216\u66f4\u6539 Apex \u6258\u7ba1\u5171\u4eab\u3002\u9876\u70b9 \u5728\u8bb0\u5f55\u6240\u6709\u8005\u66f4\u6539\u540e\u4fdd\u7559\u6258\u7ba1\u5171\u4eab\u3002<\/p>\n\n\n\n<p>Apex \u6258\u7ba1\u5171\u4eab\u5fc5\u987b\u4f7f\u7528&nbsp;<em>Apex<\/em><dfn>&nbsp;\u5171\u4eab\u539f\u56e0<\/dfn>\u3002<a><\/a>Apex \u5171\u4eab\u539f\u56e0\u662f\u5f00\u53d1\u4eba\u5458\u7684\u4e00\u79cd\u65b9\u5f0f \u8ddf\u8e2a\u4ed6\u4eec\u4e0e\u7528\u6237\u6216\u7528\u6237\u7ec4\u5171\u4eab\u8bb0\u5f55\u7684\u539f\u56e0\u3002\u4f7f\u7528\u591a\u4e2a Apex \u5171\u4eab\u539f\u56e0\u7b80\u5316\u4e86\u8fdb\u884c\u66f4\u65b0\u548c \u5220\u9664\u5171\u4eab\u8bb0\u5f55\u3002\u5b83\u4eec\u8fd8\u4f7f\u5f00\u53d1\u4eba\u5458\u80fd\u591f\u4e0e\u76f8\u540c\u7684 \u7528\u6237\u6216\u7ec4\u591a\u6b21\u4f7f\u7528\u4e0d\u540c\u7684\u539f\u56e0\u3002Apex \u5171\u4eab\u539f\u56e0\u5728\u5bf9\u8c61\u7684\u8be6\u7ec6\u4fe1\u606f\u9875\u9762\u4e0a\u5b9a\u4e49\u3002\u6bcf\u4e2a Apex \u5171\u4eab\u539f\u56e0 \u5177\u6709\u6807\u7b7e\u548c\u540d\u79f0\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u67e5\u770b\u65f6\uff0c\u6807\u7b7e\u5c06\u663e\u793a\u5728\u201c\u539f\u56e0\u201d\u5217\u4e2d \u7528\u6237\u754c\u9762\u4e2d\u8bb0\u5f55\u7684\u5171\u4eab\u3002\u6b64\u6807\u7b7e\u5141\u8bb8\u7528\u6237\u548c \u7ba1\u7406\u5458\u4e86\u89e3\u5171\u4eab\u7684\u6765\u6e90\u3002\u6807\u7b7e\u4e5f\u662f \u542f\u7528\u901a\u8fc7 Translation Workbench \u8fdb\u884c\u7ffb\u8bd1\u3002<\/li>\n\n\n\n<li>\u5728 API \u548c Apex \u4e2d\u5f15\u7528\u539f\u56e0\u65f6\uff0c\u5c06\u4f7f\u7528\u8be5\u540d\u79f0\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u6240\u6709 Apex \u5171\u4eab\u539f\u56e0\u540d\u79f0\u90fd\u91c7\u7528\u4ee5\u4e0b\u683c\u5f0f\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MyReasonName__c<\/code><\/pre>\n\n\n\n<p>Apex \u5171\u4eab\u539f\u56e0\u53ef\u4ee5\u901a\u8fc7\u7f16\u7a0b\u65b9\u5f0f\u5f15\u7528\u4e3a \u9075\u5faa\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Schema.<em>CustomObject__Share<\/em>.rowCause.<em>SharingReason__c<\/em><\/code><\/pre>\n\n\n\n<p>\u4f8b\u5982\uff0c\u5bf9\u4e8e\u540d\u4e3a Job \u7684\u5bf9\u8c61\uff0c\u540d\u4e3a Recruiter \u7684 Apex \u5171\u4eab\u539f\u56e0\u53ef\u4ee5\u662f \u5f15\u7528\u4e3a \u9075\u5faa\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Schema.Job__Share.rowCause.Recruiter__c<\/code><\/pre>\n\n\n\n<p>\u6709\u5173\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u53c2\u89c1&nbsp;System.Schema \u7c7b\u3002\u8981\u521b\u5efa Apex \u5171\u4eab\u539f\u56e0\uff0c\u8bf7\u6267\u884c\u4ee5\u4e0b\u64cd\u4f5c\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5728\u81ea\u5b9a\u4e49\u5bf9\u8c61\u7684\u7ba1\u7406\u8bbe\u7f6e\u4e2d\uff0c\u5355\u51fb\u201cApex \u5171\u4eab\u539f\u56e0\u201d\u4e2d\u7684<strong>\u201c\u65b0\u5efa<\/strong>\u201d\u76f8\u5173 \u5217\u8868\u3002<\/li>\n\n\n\n<li>\u8f93\u5165 Apex \u5171\u4eab\u539f\u56e0\u7684\u6807\u7b7e\u3002\u67e5\u770b\u8bb0\u5f55\u7684\u5171\u4eab\u65f6\uff0c\u6807\u7b7e\u5c06\u663e\u793a\u5728\u201c\u539f\u56e0\u201d\u5217\u4e2d \u5728\u7528\u6237\u754c\u9762\u4e2d\u3002\u8be5\u6807\u7b7e\u8fd8\u53ef\u901a\u8fc7 \u7ffb\u8bd1\u5de5\u4f5c\u53f0\u3002<\/li>\n\n\n\n<li>\u8f93\u5165 Apex \u5171\u4eab\u539f\u56e0\u7684\u540d\u79f0\u3002\u5f15\u7528\u65f6\u4f7f\u7528\u8be5\u540d\u79f0 API \u548c Apex \u4e2d\u7684\u539f\u56e0\u3002\u6b64\u540d\u79f0\u53ea\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c \u5b57\u6bcd\u6570\u5b57\u5b57\u7b26\uff0c\u5e76\u4e14\u5728\u60a8\u7684\u7ec4\u7ec7\u4e2d\u5fc5\u987b\u662f\u552f\u4e00\u7684\u3002\u5b83\u5fc5\u987b\u4ee5 \u5b57\u6bcd\uff0c\u4e0d\u5305\u542b\u7a7a\u683c\uff0c\u4e0d\u4ee5\u4e0b\u5212\u7ebf\u7ed3\u5c3e\uff0c\u4e5f\u4e0d\u5305\u542b \u8fde\u7eed\u4e24\u4e2a\u4e0b\u5212\u7ebf\u3002<\/li>\n\n\n\n<li>\u70b9\u51fb<strong>\u4fdd\u5b58<\/strong>\u3002<\/li>\n<\/ol>\n\n\n\n<p>\u6ce8\u610f<\/p>\n\n\n\n<p>Apex \u5171\u4eab\u539f\u56e0\u548c Apex \u6258\u7ba1\u5171\u4eab\u91cd\u65b0\u8ba1\u7b97\u4ec5\u9002\u7528\u4e8e \u81ea\u5b9a\u4e49\u5bf9\u8c61\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a><\/a>Apex \u6258\u7ba1\u5171\u4eab\u793a\u4f8b<\/h2>\n\n\n\n<p>\u5728\u6b64\u793a\u4f8b\u4e2d\uff0c\u5047\u8bbe\u60a8\u6b63\u5728\u6784\u5efa\u4e00\u4e2a\u62db\u8058\u5e94\u7528\u7a0b\u5e8f\uff0c\u5e76\u4e14\u6709\u4e00\u4e2a \u540d\u4e3a Job \u7684\u5bf9\u8c61\u3002\u60a8\u60f3\u8981\u9a8c\u8bc1\u62db\u8058\u4eba\u5458\u548c\u62db\u8058\u7ecf\u7406\u662f\u5426\u5217\u51fa\u4e86 \u5728\u5de5\u4f5c\u4e2d\u53ef\u4ee5\u8bbf\u95ee\u8bb0\u5f55\u3002\u4ee5\u4e0b\u89e6\u53d1\u5668\u6388\u4e88\u62db\u8058\u4eba\u5458\u548c \u521b\u5efa\u4f5c\u4e1a\u8bb0\u5f55\u65f6\u7684\u62db\u8058\u7ecf\u7406\u8bbf\u95ee\u6743\u9650\u3002\u6b64\u793a\u4f8b\u9700\u8981\u81ea\u5b9a\u4e49 \u540d\u4e3a Job \u7684\u5bf9\u8c61\uff0c\u5176\u4e2d\u4e24\u4e2a\u67e5\u627e\u5b57\u6bb5\u4e0e\u540d\u4e3a Hiring_Manager\u548c\u62db\u8058\u4eba\u5458\u3002\u6b64\u5916\uff0c\u4f5c\u4e1a\u81ea\u5b9a\u4e49\u5bf9\u8c61\u5e94\u5177\u6709\u4e24\u4e2a\u5171\u4eab \u6dfb\u52a0\u4e86\u79f0\u4e3aHiring_Manager\u548c\u62db\u8058\u4eba\u5458\u7684\u539f\u56e0\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>trigger JobApexSharing on Job__c (after insert) {\n    \n    if(trigger.isInsert){\n        \/\/ Create a new list of sharing objects for Job\n        List&lt;Job__Share&gt; jobShrs  = new List&lt;Job__Share&gt;();\n        \n        \/\/ Declare variables for recruiting and hiring manager sharing\n        Job__Share recruiterShr;\n        Job__Share hmShr;\n        \n        for(Job__c job : trigger.new){\n            \/\/ Instantiate the sharing objects\n            recruiterShr = new Job__Share();\n            hmShr = new Job__Share();\n            \n            \/\/ Set the ID of record being shared\n            recruiterShr.ParentId = job.Id;\n            hmShr.ParentId = job.Id;\n            \n            \/\/ Set the ID of user or group being granted access\n            recruiterShr.UserOrGroupId = job.Recruiter__c;\n            hmShr.UserOrGroupId = job.Hiring_Manager__c;\n            \n            \/\/ Set the access level\n            recruiterShr.AccessLevel = 'edit';\n            hmShr.AccessLevel = 'read';\n            \n            \/\/ Set the Apex sharing reason for hiring manager and recruiter\n            recruiterShr.RowCause = Schema.Job__Share.RowCause.Recruiter__c;\n            hmShr.RowCause = Schema.Job__Share.RowCause.Hiring_Manager__c;\n            \n            \/\/ Add objects to list for insert\n            jobShrs.add(recruiterShr);\n            jobShrs.add(hmShr);\n        }\n        \n        \/\/ Insert sharing records and capture save result \n        \/\/ The false parameter allows for partial processing if multiple records are passed \n        \/\/ into the operation \n        Database.SaveResult&#91;] lsr = Database.insert(jobShrs,false);\n        \n        \/\/ Create counter\n        Integer i=0;\n        \n        \/\/ Process the save results\n        for(Database.SaveResult sr : lsr){\n            if(!sr.isSuccess()){\n                \/\/ Get the first save result error\n                Database.Error err = sr.getErrors()&#91;0];\n                \n                \/\/ Check if the error is related to a trivial access level\n                \/\/ Access levels equal or more permissive than the object's default \n                \/\/ access level are not allowed. \n                \/\/ These sharing records are not required and thus an insert exception is \n                \/\/ acceptable. \n                if(!(err.getStatusCode() == StatusCode.FIELD_FILTER_VALIDATION_EXCEPTION  \n                                               &amp;&amp;  err.getMessage().contains('AccessLevel'))){\n                    \/\/ Throw an error when the error is not related to trivial access level.\n                    trigger.newMap.get(jobShrs&#91;i].ParentId).\n                      addError(\n                       'Unable to grant sharing access due to following exception: '\n                       + err.getMessage());\n                }\n            }\n            i++;\n        }   \n    }\n    \n}<\/code><\/pre>\n\n\n\n<p>\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u63d2\u5165\u5171\u4eab\u884c\u4f1a\u5bfc\u81f4 \u73b0\u6709\u5171\u4eab\u884c\u3002\u8bf7\u770b\u4ee5\u4e0b\u793a\u4f8b\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u624b\u52a8\u5171\u4eab\u8bbf\u95ee\u7ea7\u522b\u8bbe\u7f6e\u4e3a\u201c\u8bfb\u53d6\u201d\uff0c\u5e76\u63d2\u5165\u4e00\u4e2a\u65b0\u7ea7\u522b\uff0c\u8bbe\u7f6e\u4e3a \u5199\u3002\u539f\u59cb\u5171\u4eab\u884c\u5c06\u66f4\u65b0\u4e3a\u201c\u5199\u5165\u201d\uff0c\u6307\u793a\u8f83\u9ad8\u7684 \u8bbf\u95ee\u7ea7\u522b\u3002<\/li>\n\n\n\n<li>\u7528\u6237\u53ef\u4ee5\u8bbf\u95ee\u5e10\u6237\uff0c\u56e0\u4e3a\u4ed6\u4eec\u53ef\u4ee5\u8bbf\u95ee\u5176\u5b50\u8bb0\u5f55 \uff08\u8054\u7cfb\u4eba\u3001\u6848\u4f8b\u3001\u5546\u673a\u7b49\uff09\u3002\u5982\u679c\u5e10\u6237\u5171\u4eab\u89c4\u5219\u662f created\uff0c\u5171\u4eab\u89c4\u5219\u884c\u539f\u56e0\uff08\u8fd9\u662f\u66f4\u9ad8\u7684\u8bbf\u95ee\u7ea7\u522b\uff09 \u66ff\u6362\u7236\u7ea7\u9690\u5f0f\u5171\u4eab\u884c\u539f\u56e0\uff0c\u6307\u793a \u8bbf\u95ee\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u91cd\u8981<\/p>\n\n\n\n<p>\u5bf9\u8c61\u7684\u7ec4\u7ec7\u8303\u56f4\u7684\u9ed8\u8ba4\u8bbf\u95ee\u7ea7\u522b\u5fc5\u987b \u672a\u8bbe\u7f6e\u4e3a\u6700\u5bbd\u677e\u7684\u8bbf\u95ee\u7ea7\u522b\u3002\u5bf9\u4e8e\u81ea\u5b9a\u4e49\u5bf9\u8c61\uff0c\u6b64\u7ea7\u522b\u4e3a \u516c\u5171\u8bfb\/\u5199\u3002\u6709\u5173\u8be6\u7ec6\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605\u4e86\u89e3\u5171\u4eab\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e3a Customer Community Plus \u7528\u6237\u521b\u5efa Apex \u6258\u7ba1\u5171\u4eab<\/h2>\n\n\n\n<p>Customer Community Plus \u7528\u6237\u4ee5\u524d\u79f0\u4e3a Customer Portal \u7528\u6237\u3002\u5171\u4eab \u8fd9\u4e9b\u7528\u6237\u65e0\u6cd5\u4f7f\u7528\u5bf9\u8c61\uff0c\u4f8b\u5982 \u548c \u3002\u5982\u679c \u60a8\u5fc5\u987b\u4ee5Customer Community Plus\u7528\u6237\u8eab\u4efd\u4f7f\u7528\u5171\u4eab\u5bf9\u8c61\uff0c\u8bf7\u8003\u8651\u4f7f\u7528\u4e00\u4e2a trigger\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f7f\u7528\u5173\u952e\u5b57\u8fdb\u884c\u64cd\u4f5c\u3002\u5426\u5219\uff0c\u8bf7\u4f7f\u7528\u5177\u6709\u76f8\u540c \u5173\u952e\u5b57\u4f7f DML \u64cd\u4f5c\u80fd\u591f\u6210\u529f\u8fd0\u884c\u3002\u5355\u72ec\u7684\u5b9e\u7528\u7a0b\u5e8f\u7c7b \u4e5f\u53ef\u7528\u4e8e\u542f\u7528\u6b64\u8bbf\u95ee\u3002<samp>AccountShare<\/samp><samp>ContactShare<\/samp><samp>without sharing<\/samp><\/p>\n\n\n\n<p>\u652f\u6301\u901a\u8fc7\u5199\u5165\u5171\u4eab\u5bf9\u8c61\u7684\u624b\u52a8\/\u9876\u70b9\u5171\u4eab\u6388\u4e88\u53ef\u89c1\u6027 \u4f46\u5bf9\u8c61\u672c\u8eab\u5bf9Customer Community Plus\u7528\u6237\u4e0d\u53ef\u7528\u3002 \u4f46\u662f\uff0c\u5176\u4ed6\u7528\u6237\u53ef\u4ee5\u6dfb\u52a0\u6388\u4e88\u5bf9Customer Community Plus\u8bbf\u95ee\u6743\u9650\u7684\u5171\u4eab \u7528\u6237\u3002<\/p>\n\n\n\n<p>\u8b66\u544a<\/p>\n\n\n\n<p>\u542f\u7528\u6570\u5b57\u4f53\u9a8c\u540e\uff0c\u89d2\u8272\u548c \u901a\u8fc7 Apex \u6258\u7ba1\u5171\u4eab\u7684\u4e0b\u5c5e\u4f1a\u81ea\u52a8\u63d0\u4f9b\u7ed9\u89d2\u8272\uff0c \u5185\u90e8\u548c\u95e8\u6237\u4e0b\u5c5e\u3002\u8981\u4fdd\u62a4\u5916\u90e8\u7528\u6237\u7684\u8bbf\u95ee\u6743\u9650\uff0c\u8bf7\u66f4\u65b0\u60a8\u7684 Apex \u4ee3\u7801\uff0c\u4ee5\u4fbf\u521b\u5efa\u4e0e Role \u548c Internal Subordinates \u7ec4\u7684\u5171\u4eab\u3002\u56e0\u4e3a \u6b64\u8f6c\u6362\u662f\u5927\u89c4\u6a21\u64cd\u4f5c\uff0c\u8bf7\u8003\u8651\u4f7f\u7528\u6279\u5904\u7406 Apex\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u91cd\u65b0\u8ba1\u7b97 Apex \u6258\u7ba1\u5171\u4eab<\/h2>\n\n\n\n<p>Salesforce \u4f1a\u81ea\u52a8\u91cd\u65b0\u8ba1\u7b97\u5bf9\u8c61\u4e0a\u6240\u6709\u8bb0\u5f55\u7684\u5171\u4eab\uff0c\u5f53\u5176 \u7ec4\u7ec7\u8303\u56f4\u7684\u5171\u4eab\u9ed8\u8ba4\u8bbf\u95ee\u7ea7\u522b\u66f4\u6539\u3002\u91cd\u65b0\u8ba1\u7b97\u6dfb\u52a0\u6258\u7ba1 \u5728\u9002\u5f53\u7684\u65f6\u5019\u5206\u4eab\u3002\u6b64\u5916\uff0c\u5982\u679c\u8bbf\u95ee \u4ed6\u4eec\u6388\u4e88\u88ab\u8ba4\u4e3a\u662f\u591a\u4f59\u7684\u3002\u4f8b\u5982\uff0c\u624b\u52a8\u5171\u4eab\uff0c\u5b83\u6388\u4e88\u53ea\u8bfb \u5bf9\u7528\u6237\u7684\u8bbf\u95ee\u6743\u9650\uff0c\u5f53\u5bf9\u8c61\u7684\u5171\u4eab\u6a21\u578b\u4ece Private \u66f4\u6539\u65f6\uff0c\u5c06\u5220\u9664\u5bf9\u7528\u6237\u7684\u8bbf\u95ee\u6743\u9650 \u66f4\u6539\u4e3a\u516c\u5171\u53ea\u8bfb\u3002<\/p>\n\n\n\n<p>\u82e5\u8981\u91cd\u65b0\u8ba1\u7b97 Apex \u6258\u7ba1\u5171\u4eab\uff0c\u5fc5\u987b\u7f16\u5199\u4e00\u4e2a\u5b9e\u73b0 Salesforce \u63d0\u4f9b\u7684\u7528\u4e8e\u91cd\u65b0\u8ba1\u7b97\u7684\u754c\u9762\u3002\u7136\u540e\uff0c\u60a8\u5fc5\u987b\u5173\u8054\u8be5\u7c7b \u4e0e\u81ea\u5b9a\u4e49\u5bf9\u8c61\u4e00\u8d77\u4f7f\u7528\uff0c\u5728\u81ea\u5b9a\u4e49\u5bf9\u8c61\u7684\u8be6\u7ec6\u4fe1\u606f\u9875\u9762\u4e0a\uff0c\u5728 Apex \u5171\u4eab\u4e2d \u91cd\u65b0\u8ba1\u7b97\u76f8\u5173\u5217\u8868\u3002<\/p>\n\n\n\n<p>\u6ce8\u610f<\/p>\n\n\n\n<p>Apex \u5171\u4eab\u539f\u56e0\u548c Apex \u6258\u7ba1\u5171\u4eab\u91cd\u65b0\u8ba1\u7b97\u4ec5\u9002\u7528\u4e8e \u81ea\u5b9a\u4e49\u5bf9\u8c61\u3002<\/p>\n\n\n\n<p>\u60a8\u53ef\u4ee5\u4ece\u81ea\u5b9a\u4e49\u5bf9\u8c61\u8be6\u7ec6\u4fe1\u606f\u9875\u9762\u6267\u884c\u6b64\u7c7b\uff0c\u5176\u4e2d Apex \u5171\u4eab \u6307\u5b9a\u539f\u56e0\u3002\u7ba1\u7406\u5458\u53ef\u80fd\u9700\u8981\u91cd\u65b0\u8ba1\u7b97 Apex \u6258\u7ba1\u5171\u4eab \u5982\u679c\u9501\u5b9a\u95ee\u9898\u963b\u6b62 Apex \u4ee3\u7801\u5411\u7528\u6237\u6388\u4e88\u8bbf\u95ee\u6743\u9650\uff0c\u5219\u5bf9\u8c61\u4e3a \u7531\u5e94\u7528\u7a0b\u5e8f\u7684\u903b\u8f91\u5b9a\u4e49\u3002\u8fd8\u53ef\u4ee5\u4f7f\u7528&nbsp;Database.executeBatch \u65b9\u6cd5\u4ee5\u7f16\u7a0b\u65b9\u5f0f\u8c03\u7528 Apex \u6258\u7ba1\u5171\u4eab\u91cd\u65b0\u8ba1\u7b97\u3002<\/p>\n\n\n\n<p>\u6ce8\u610f<\/p>\n\n\n\n<p>\u6bcf\u6b21\u81ea\u5b9a\u4e49\u5bf9\u8c61\u7684\u7ec4\u7ec7\u8303\u56f4\u5171\u4eab\u9ed8\u8ba4\u8bbf\u95ee\u7ea7\u522b\u4e3a \u66f4\u65b0\u65f6\uff0c\u4e3a\u5173\u8054\u7684\u81ea\u5b9a\u4e49\u5bf9\u8c61\u5b9a\u4e49\u7684\u4efb\u4f55 Apex \u91cd\u65b0\u8ba1\u7b97\u7c7b\u4e5f\u4f1a \u6267\u884c\u3002<\/p>\n\n\n\n<p>\u8981\u76d1\u89c6\u6216\u505c\u6b62 Apex \u91cd\u65b0\u8ba1\u7b97\u7684\u6267\u884c\uff0c\u8bf7\u4ece\u201c\u8bbe\u7f6e\u201d\u4e2d\u8f93\u5165\u201c\u5feb\u901f\u67e5\u627e\u201d\u6846\uff0c\u7136\u540e \u9009\u62e9&nbsp;<strong>Apex Jobs<\/strong>\u3002<kbd>Apex Jobs<\/kbd><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a><\/a>\u521b\u5efa\u7528\u4e8e\u91cd\u65b0\u8ba1\u7b97\u7684 Apex \u7c7b \u5171\u4eab<\/h2>\n\n\n\n<p>\u8981\u91cd\u65b0\u8ba1\u7b97 Apex \u6258\u7ba1\u5171\u4eab\uff0c\u60a8\u5fc5\u987b\u7f16\u5199\u4e00\u4e2a Apex \u7c7b\u6765\u6267\u884c \u91cd\u65b0\u8ba1\u7b97\u3002\u6b64\u7c7b\u5fc5\u987b\u5b9e\u73b0 Salesforce \u63d0\u4f9b\u7684\u63a5\u53e3\u3002<samp>Database.Batchable<\/samp><\/p>\n\n\n\n<p>\u8be5\u63a5\u53e3\u7528\u4e8e \u6240\u6709\u6279\u5904\u7406 Apex \u8fdb\u7a0b\uff0c\u5305\u62ec\u91cd\u65b0\u8ba1\u7b97 Apex \u6258\u7ba1\u5171\u4eab\u3002\u60a8\u53ef\u4ee5 \u5728\u7ec4\u7ec7\u4e2d\u591a\u6b21\u5b9e\u73b0\u6b64\u63a5\u53e3\u3002\u66f4\u591a\u4fe1\u606f \u6709\u5173\u5fc5\u987b\u5b9e\u73b0\u7684\u65b9\u6cd5\uff0c\u8bf7\u53c2\u9605\u4f7f\u7528 Batch Apex\u3002<samp>Database.Batchable<\/samp><\/p>\n\n\n\n<p>\u5728\u521b\u5efa Apex \u6258\u7ba1\u5171\u4eab\u91cd\u65b0\u8ba1\u7b97\u7c7b\u4e4b\u524d\uff0c\u8fd8\u8981\u8003\u8651\u6700\u4f73\u505a\u6cd5\u3002<\/p>\n\n\n\n<p>\u91cd\u8981<\/p>\n\n\n\n<p>\u5bf9\u8c61\u7684\u7ec4\u7ec7\u8303\u56f4\u7684\u9ed8\u8ba4\u8bbf\u95ee\u7ea7\u522b\u5fc5\u987b \u672a\u8bbe\u7f6e\u4e3a\u6700\u5bbd\u677e\u7684\u8bbf\u95ee\u7ea7\u522b\u3002\u5bf9\u4e8e\u81ea\u5b9a\u4e49\u5bf9\u8c61\uff0c\u6b64\u7ea7\u522b\u4e3a \u516c\u5171\u8bfb\/\u5199\u3002\u6709\u5173\u8be6\u7ec6\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605\u4e86\u89e3\u5171\u4eab\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a><\/a>Apex \u6258\u7ba1\u5171\u4eab\u91cd\u65b0\u8ba1\u7b97 \u4f8b<\/h2>\n\n\n\n<p><a><\/a>\u5728\u6b64\u793a\u4f8b\u4e2d\uff0c\u5047\u8bbe\u60a8\u6b63\u5728\u6784\u5efa\u4e00\u4e2a \u62db\u8058\u5e94\u7528\u7a0b\u5e8f\uff0c\u5e76\u6709\u4e00\u4e2a\u540d\u4e3a Job \u7684\u5bf9\u8c61\u3002\u60a8\u60f3\u8981\u9a8c\u8bc1\u8fd9\u4e00\u70b9 \u62db\u8058\u4e2d\u5217\u51fa\u7684\u62db\u8058\u4eba\u5458\u548c\u62db\u8058\u7ecf\u7406\u53ef\u4ee5\u8bbf\u95ee \u8bb0\u5f55\u3002\u4ee5\u4e0b Apex \u7c7b\u6267\u884c\u6b64\u9a8c\u8bc1\u3002<a><\/a>\u6b64\u793a\u4f8b\u9700\u8981\u4e00\u4e2a\u540d\u4e3a Job \u7684\u81ea\u5b9a\u4e49\u5bf9\u8c61\uff0c\u5176\u4e2d\u5305\u542b\u4e24\u4e2a\u67e5\u627e\u5b57\u6bb5 \u4e0e\u540d\u4e3a Hiring_Manager \u548c Recruiter \u7684\u7528\u6237\u8bb0\u5f55\u76f8\u5173\u8054\u3002\u6b64\u5916\uff0c\u5de5\u4f5c \u81ea\u5b9a\u4e49\u5bf9\u8c61\u5e94\u6dfb\u52a0\u4e24\u4e2a\u5171\u4eab\u539f\u56e0\uff0c\u79f0\u4e3a Hiring_Manager \u548c \u62db\u8058\u3002\u5728\u8fd0\u884c\u6b64\u793a\u4f8b\u4e4b\u524d\uff0c\u8bf7\u5c06\u7535\u5b50\u90ae\u4ef6\u5730\u5740\u66ff\u6362\u4e3a \u8981\u5411\u5176\u53d1\u9001\u9519\u8bef\u901a\u77e5\u548c\u4f5c\u4e1a\u5b8c\u6210\u7684\u6709\u6548\u7535\u5b50\u90ae\u4ef6\u5730\u5740 \u901a\u77e5\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>global class JobSharingRecalc implements Database.Batchable&lt;sObject&gt; {\n    \n    \/\/ String to hold email address that emails will be sent to. \n    \/\/ Replace its value with a valid email address.\n    static String emailAddress = 'admin@yourcompany.com';\n    \n    \/\/ The start method is called at the beginning of a sharing recalculation.\n    \/\/ This method returns a SOQL query locator containing the records \n    \/\/ to be recalculated. \n    global Database.QueryLocator start(Database.BatchableContext BC){\n        return Database.getQueryLocator(&#91;SELECT Id, Hiring_Manager__c, Recruiter__c \n                                         FROM Job__c]);  \n    }\n    \n    \/\/ The executeBatch method is called for each chunk of records returned from start.  \n    global void execute(Database.BatchableContext BC, List&lt;sObject&gt; scope){\n       \/\/ Create a map for the chunk of records passed into method.\n        Map&lt;ID, Job__c&gt; jobMap = new Map&lt;ID, Job__c&gt;((List&lt;Job__c&gt;)scope);  \n        \n        \/\/ Create a list of Job__Share objects to be inserted.\n        List&lt;Job__Share&gt; newJobShrs = new List&lt;Job__Share&gt;();\n               \n        \/\/ Locate all existing sharing records for the Job records in the batch.\n        \/\/ Only records using an Apex sharing reason for this app should be returned. \n        List&lt;Job__Share&gt; oldJobShrs = &#91;SELECT Id FROM Job__Share WHERE ParentId IN \n             :jobMap.keySet() AND \n            (RowCause = :Schema.Job__Share.rowCause.Recruiter__c OR\n            RowCause = :Schema.Job__Share.rowCause.Hiring_Manager__c)]; \n        \n        \/\/ Construct new sharing records for the hiring manager and recruiter \n        \/\/ on each Job record.\n        for(Job__c job : jobMap.values()){\n            Job__Share jobHMShr = new Job__Share();\n            Job__Share jobRecShr = new Job__Share();\n            \n            \/\/ Set the ID of user (hiring manager) on the Job record being granted access.\n            jobHMShr.UserOrGroupId = job.Hiring_Manager__c;\n            \n            \/\/ The hiring manager on the job should always have 'Read Only' access.\n            jobHMShr.AccessLevel = 'Read';\n            \n            \/\/ The ID of the record being shared\n            jobHMShr.ParentId = job.Id;\n            \n            \/\/ Set the rowCause to the Apex sharing reason for hiring manager.\n            \/\/ This establishes the sharing record as Apex managed sharing.\n            jobHMShr.RowCause = Schema.Job__Share.RowCause.Hiring_Manager__c;\n            \n            \/\/ Add sharing record to list for insertion.\n            newJobShrs.add(jobHMShr);\n            \n            \/\/ Set the ID of user (recruiter) on the Job record being granted access.\n            jobRecShr.UserOrGroupId = job.Recruiter__c;\n            \n            \/\/ The recruiter on the job should always have 'Read\/Write' access.\n            jobRecShr.AccessLevel = 'Edit';\n            \n            \/\/ The ID of the record being shared\n            jobRecShr.ParentId = job.Id;\n            \n            \/\/ Set the rowCause to the Apex sharing reason for recruiter.\n            \/\/ This establishes the sharing record as Apex managed sharing.\n            jobRecShr.RowCause = Schema.Job__Share.RowCause.Recruiter__c;\n            \n         \/\/ Add the sharing record to the list for insertion.            \n            newJobShrs.add(jobRecShr);\n        }\n        \n        try {\n           \/\/ Delete the existing sharing records.\n           \/\/ This allows new sharing records to be written from scratch.\n            Delete oldJobShrs;\n            \n           \/\/ Insert the new sharing records and capture the save result. \n           \/\/ The false parameter allows for partial processing if multiple records are \n           \/\/ passed into operation. \n           Database.SaveResult&#91;] lsr = Database.insert(newJobShrs,false);\n           \n           \/\/ Process the save results for insert.\n           for(Database.SaveResult sr : lsr){\n               if(!sr.isSuccess()){\n                   \/\/ Get the first save result error.\n                   Database.Error err = sr.getErrors()&#91;0];\n                   \n                   \/\/ Check if the error is related to trivial access level.\n                   \/\/ Access levels equal or more permissive than the object's default \n                   \/\/ access level are not allowed. \n                   \/\/ These sharing records are not required and thus an insert exception \n                   \/\/ is acceptable. \n                   if(!(err.getStatusCode() == StatusCode.FIELD_FILTER_VALIDATION_EXCEPTION  \n                                     &amp;&amp;  err.getMessage().contains('AccessLevel'))){\n                       \/\/ Error is not related to trivial access level.\n                       \/\/ Send an email to the Apex job's submitter.\n                     Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();\n                     String&#91;] toAddresses = new String&#91;] {emailAddress}; \n                     mail.setToAddresses(toAddresses); \n                     mail.setSubject('Apex Sharing Recalculation Exception');\n                     mail.setPlainTextBody(\n                       'The Apex sharing recalculation threw the following exception: ' + \n                             err.getMessage());\n                     Messaging.sendEmail(new Messaging.SingleEmailMessage&#91;] { mail });\n                   }\n               }\n           }   \n        } catch(DmlException e) {\n           \/\/ Send an email to the Apex job's submitter on failure.\n            Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();\n            String&#91;] toAddresses = new String&#91;] {emailAddress}; \n            mail.setToAddresses(toAddresses); \n            mail.setSubject('Apex Sharing Recalculation Exception');\n            mail.setPlainTextBody(\n              'The Apex sharing recalculation threw the following exception: ' + \n                        e.getMessage());\n            Messaging.sendEmail(new Messaging.SingleEmailMessage&#91;] { mail });\n        }\n    }\n    \n    \/\/ The finish method is called at the end of a sharing recalculation.\n    global void finish(Database.BatchableContext BC){  \n        \/\/ Send an email to the Apex job's submitter notifying of job completion.\n        Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();\n        String&#91;] toAddresses = new String&#91;] {emailAddress}; \n        mail.setToAddresses(toAddresses); \n        mail.setSubject('Apex Sharing Recalculation Completed.');\n        mail.setPlainTextBody\n                      ('The Apex sharing recalculation finished processing');\n        Messaging.sendEmail(new Messaging.SingleEmailMessage&#91;] { mail });\n    }\n    \n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><a><\/a>\u6d4b\u8bd5 Apex \u6258\u7ba1\u5171\u4eab \u91cd\u65b0\u8ba1\u7b97<\/h2>\n\n\n\n<p>\u6b64\u793a\u4f8b\u63d2\u5165 5 \u4e2a\u4f5c\u4e1a\u8bb0\u5f55\u5e76\u8c03\u7528\u5df2\u5b9e\u73b0\u7684\u6279\u5904\u7406\u4f5c\u4e1a \u5728\u4e0a\u4e00\u793a\u4f8b\u7684 Batch \u7c7b\u4e2d\u3002\u6b64\u793a\u4f8b\u9700\u8981\u4e00\u4e2a\u81ea\u5b9a\u4e49\u5bf9\u8c61 \u79f0\u4e3a Job\uff0c\u5176\u4e2d\u6709\u4e24\u4e2a\u4e0e\u7528\u6237\u8bb0\u5f55\u5173\u8054\u7684\u67e5\u627e\u5b57\u6bb5\uff0c\u79f0\u4e3a Hiring_Manager\u548c\u62db\u8058\u4eba\u5458\u3002\u6b64\u5916\uff0c\u4f5c\u4e1a\u81ea\u5b9a\u4e49\u5bf9\u8c61\u5e94\u5177\u6709\u4e24\u4e2a\u5171\u4eab \u6dfb\u52a0\u4e86\u79f0\u4e3aHiring_Manager\u548c\u62db\u8058\u4eba\u5458\u7684\u539f\u56e0\u3002\u5728\u8fd0\u884c\u6b64\u6d4b\u8bd5\u4e4b\u524d\uff0c\u8bf7\u5c06 \u4f5c\u4e1a\u5230\u4e13\u7528\u7684\u7ec4\u7ec7\u8303\u56f4\u9ed8\u8ba4\u5171\u4eab\u3002\u8bf7\u6ce8\u610f\uff0c\u7531\u4e8e\u7535\u5b50\u90ae\u4ef6 \u4e0d\u662f\u4ece\u6d4b\u8bd5\u53d1\u9001\u7684\uff0c\u5e76\u4e14\u56e0\u4e3a\u6279\u5904\u7406\u7c7b\u662f\u7531\u6d4b\u8bd5\u8c03\u7528\u7684 \u65b9\u6cd5\uff0c\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\u4e0d\u4f1a\u53d1\u9001\u7535\u5b50\u90ae\u4ef6\u901a\u77e5\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@isTest\nprivate class JobSharingTester {\n   \n    \/\/ Test for the JobSharingRecalc class    \n    static testMethod void testApexSharing(){\n       \/\/ Instantiate the class implementing the Database.Batchable interface.     \n        JobSharingRecalc recalc = new JobSharingRecalc();\n        \n        \/\/ Select users for the test.\n        List&lt;User&gt; users = &#91;SELECT Id FROM User WHERE IsActive = true LIMIT 2];\n        ID User1Id = users&#91;0].Id;\n        ID User2Id = users&#91;1].Id;\n        \n        \/\/ Insert some test job records.                 \n        List&lt;Job__c&gt; testJobs = new List&lt;Job__c&gt;();\n        for (Integer i=0;i&lt;5;i++) {\n        Job__c j = new Job__c();\n            j.Name = 'Test Job ' + i;\n            j.Recruiter__c = User1Id;\n            j.Hiring_Manager__c = User2Id;\n            testJobs.add(j);\n        }\n        insert testJobs;\n        \n        Test.startTest();\n        \n        \/\/ Invoke the Batch class.\n        String jobId = Database.executeBatch(recalc);\n        \n        Test.stopTest();\n        \n        \/\/ Get the Apex job and verify there are no errors.\n        AsyncApexJob aaj = &#91;Select JobType, TotalJobItems, JobItemsProcessed, Status, \n                            CompletedDate, CreatedDate, NumberOfErrors \n                            from AsyncApexJob where Id = :jobId];\n        System.assertEquals(0, aaj.NumberOfErrors);\n      \n        \/\/ This query returns jobs and related sharing records that were inserted       \n        \/\/ by the batch job's execute method.     \n        List&lt;Job__c&gt; jobs = &#91;SELECT Id, Hiring_Manager__c, Recruiter__c, \n            (SELECT Id, ParentId, UserOrGroupId, AccessLevel, RowCause FROM Shares \n            WHERE (RowCause = :Schema.Job__Share.rowCause.Recruiter__c OR \n            RowCause = :Schema.Job__Share.rowCause.Hiring_Manager__c))\n            FROM Job__c];       \n        \n        \/\/ Validate that Apex managed sharing exists on jobs.     \n        for(Job__c job : jobs){\n            \/\/ Two Apex managed sharing records should exist for each job\n            \/\/ when using the Private org-wide default. \n            System.assert(job.Shares.size() == 2);\n            \n            for(Job__Share jobShr : job.Shares){\n               \/\/ Test the sharing record for hiring manager on job.             \n                if(jobShr.RowCause == Schema.Job__Share.RowCause.Hiring_Manager__c){\n                    System.assertEquals(jobShr.UserOrGroupId,job.Hiring_Manager__c);\n                    System.assertEquals(jobShr.AccessLevel,'Read');\n                }\n                \/\/ Test the sharing record for recruiter on job.\n                else if(jobShr.RowCause == Schema.Job__Share.RowCause.Recruiter__c){\n                    System.assertEquals(jobShr.UserOrGroupId,job.Recruiter__c);\n                    System.assertEquals(jobShr.AccessLevel,'Edit');\n                }\n            }\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><a><\/a>\u5173\u8054\u7528\u4e8e \u91cd\u65b0\u8ba1\u7b97<\/h2>\n\n\n\n<p>\u7528\u4e8e\u91cd\u65b0\u8ba1\u7b97\u7684 Apex \u7c7b\u5fc5\u987b\u4e0e\u81ea\u5b9a\u4e49\u5bf9\u8c61\u76f8\u5173\u8054\u3002\u8981\u5c06 Apex \u6258\u7ba1\u5171\u4eab\u91cd\u65b0\u8ba1\u7b97\u7c7b\u4e0e\u81ea\u5b9a\u4e49\u5bf9\u8c61\u76f8\u5173\u8054\uff0c\u8bf7\u6267\u884c\u4ee5\u4e0b\u64cd\u4f5c\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u4ece\u81ea\u5b9a\u4e49\u5bf9\u8c61\u7684\u7ba1\u7406\u8bbe\u7f6e\u4e2d\uff0c\u8f6c\u5230 Apex Sharing \u91cd\u65b0\u8ba1\u7b97\u3002<\/li>\n\n\n\n<li>\u9009\u62e9\u91cd\u65b0\u8ba1\u7b97\u6b64\u5bf9\u8c61\u7684 Apex \u5171\u4eab\u7684 Apex \u7c7b\u3002 \u60a8\u9009\u62e9\u7684\u7c7b\u5fc5\u987b\u5b9e\u73b0\u63a5\u53e3\u3002\u60a8\u4e0d\u80fd\u5173\u8054\u76f8\u540c\u7684 Apex \u7c7b\u591a\u6b21\u4f7f\u7528\u540c\u4e00\u4e2a\u81ea\u5b9a\u4e49\u5bf9\u8c61\u3002<samp>Database.Batchable<\/samp><\/li>\n\n\n\n<li>\u70b9\u51fb<strong>\u4fdd\u5b58<\/strong>\u3002<\/li>\n<\/ol>\n\n\n\n<p><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.apexcode.meta\/apexcode\/apex_bulk_sharing.htm\">ref<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5f53\u60a8\u4f7f\u7528 Apex \u65f6\uff0c \u4ee3\u7801\u7684\u5b89\u5168\u6027\u81f3\u5173\u91cd\u8981\u3002\u60a8\u9700\u8981\u4e3a Apex \u7c7b\u6dfb\u52a0\u7528\u6237\u6743\u9650\u5e76\u5f3a\u5236\u6267\u884c \u5171\u4eab\u89c4\u5219\u3002\u8bf7\u7ee7\u7eed\u9605\u8bfb\uff0c\u4e86\u89e3 Apex \u6258\u7ba1\u5171\u4eab\u548c \u83b7\u53d6\u4e00\u4e9b\u5b89\u5168\u63d0\u793a\u3002<\/p>\n","protected":false},"author":1,"featured_media":3667,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[199],"tags":[],"class_list":["post-3666","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-apex-"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Apex Security \u548c \u5171\u4eab - \u767d\u767d\u968f\u7b14<\/title>\n<meta name=\"description\" content=\"\u5f53\u60a8\u4f7f\u7528 Apex \u65f6\uff0c \u4ee3\u7801\u7684\u5b89\u5168\u6027\u81f3\u5173\u91cd\u8981\u3002\u60a8\u9700\u8981\u4e3a Apex \u7c7b\u6dfb\u52a0\u7528\u6237\u6743\u9650\u5e76\u5f3a\u5236\u6267\u884c \u5171\u4eab\u89c4\u5219\u3002\u8bf7\u7ee7\u7eed\u9605\u8bfb\uff0c\u4e86\u89e3 Apex \u6258\u7ba1\u5171\u4eab\u548c \u83b7\u53d6\u4e00\u4e9b\u5b89\u5168\u63d0\u793a\u3002\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.ponybai.com\/?p=3666\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Apex Security \u548c \u5171\u4eab - \u767d\u767d\u968f\u7b14\" \/>\n<meta property=\"og:description\" content=\"\u5f53\u60a8\u4f7f\u7528 Apex \u65f6\uff0c \u4ee3\u7801\u7684\u5b89\u5168\u6027\u81f3\u5173\u91cd\u8981\u3002\u60a8\u9700\u8981\u4e3a Apex \u7c7b\u6dfb\u52a0\u7528\u6237\u6743\u9650\u5e76\u5f3a\u5236\u6267\u884c \u5171\u4eab\u89c4\u5219\u3002\u8bf7\u7ee7\u7eed\u9605\u8bfb\uff0c\u4e86\u89e3 Apex \u6258\u7ba1\u5171\u4eab\u548c \u83b7\u53d6\u4e00\u4e9b\u5b89\u5168\u63d0\u793a\u3002\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.ponybai.com\/?p=3666\" \/>\n<meta property=\"og:site_name\" content=\"\u767d\u767d\u968f\u7b14\" \/>\n<meta property=\"article:published_time\" content=\"2023-11-30T10:44:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-11-21T11:02:28+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.ponybai.com\/wp-content\/uploads\/2023\/11\/Apex\u5b89\u5168.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1335\" \/>\n\t<meta property=\"og:image:height\" content=\"1039\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"ponybai\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"ponybai\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"http:\/\/www.ponybai.com\/?p=3666#article\",\"isPartOf\":{\"@id\":\"http:\/\/www.ponybai.com\/?p=3666\"},\"author\":{\"name\":\"ponybai\",\"@id\":\"http:\/\/www.ponybai.com\/#\/schema\/person\/935c7592c850c65e1e5eba4530dbf883\"},\"headline\":\"Apex Security \u548c \u5171\u4eab\",\"datePublished\":\"2023-11-30T10:44:20+00:00\",\"dateModified\":\"2023-11-21T11:02:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"http:\/\/www.ponybai.com\/?p=3666\"},\"wordCount\":679,\"publisher\":{\"@id\":\"http:\/\/www.ponybai.com\/#\/schema\/person\/935c7592c850c65e1e5eba4530dbf883\"},\"articleSection\":[\"Apex \u5f00\u53d1\u4eba\u5458\u6307\u5357\"],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.ponybai.com\/?p=3666\",\"url\":\"http:\/\/www.ponybai.com\/?p=3666\",\"name\":\"Apex Security \u548c \u5171\u4eab - \u767d\u767d\u968f\u7b14\",\"isPartOf\":{\"@id\":\"http:\/\/www.ponybai.com\/#website\"},\"datePublished\":\"2023-11-30T10:44:20+00:00\",\"dateModified\":\"2023-11-21T11:02:28+00:00\",\"description\":\"\u5f53\u60a8\u4f7f\u7528 Apex \u65f6\uff0c \u4ee3\u7801\u7684\u5b89\u5168\u6027\u81f3\u5173\u91cd\u8981\u3002\u60a8\u9700\u8981\u4e3a Apex \u7c7b\u6dfb\u52a0\u7528\u6237\u6743\u9650\u5e76\u5f3a\u5236\u6267\u884c \u5171\u4eab\u89c4\u5219\u3002\u8bf7\u7ee7\u7eed\u9605\u8bfb\uff0c\u4e86\u89e3 Apex \u6258\u7ba1\u5171\u4eab\u548c \u83b7\u53d6\u4e00\u4e9b\u5b89\u5168\u63d0\u793a\u3002\",\"breadcrumb\":{\"@id\":\"http:\/\/www.ponybai.com\/?p=3666#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.ponybai.com\/?p=3666\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.ponybai.com\/?p=3666#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"http:\/\/www.ponybai.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Apex Security \u548c \u5171\u4eab\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.ponybai.com\/#website\",\"url\":\"http:\/\/www.ponybai.com\/\",\"name\":\"\u767d\u767d\u968f\u7b14\",\"description\":\"Salesforce\u5b98\u65b9\u8bb2\u5e08\",\"publisher\":{\"@id\":\"http:\/\/www.ponybai.com\/#\/schema\/person\/935c7592c850c65e1e5eba4530dbf883\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/www.ponybai.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"http:\/\/www.ponybai.com\/#\/schema\/person\/935c7592c850c65e1e5eba4530dbf883\",\"name\":\"ponybai\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"http:\/\/www.ponybai.com\/#\/schema\/person\/image\/\",\"url\":\"http:\/\/www.ponybai.com\/wp-content\/uploads\/2025\/03\/cropped-Ihsans-WeChatQR.jpg\",\"contentUrl\":\"http:\/\/www.ponybai.com\/wp-content\/uploads\/2025\/03\/cropped-Ihsans-WeChatQR.jpg\",\"width\":248,\"height\":248,\"caption\":\"ponybai\"},\"logo\":{\"@id\":\"http:\/\/www.ponybai.com\/#\/schema\/person\/image\/\"},\"sameAs\":[\"http:\/\/121.37.188.161\"],\"url\":\"http:\/\/www.ponybai.com\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Apex Security \u548c \u5171\u4eab - \u767d\u767d\u968f\u7b14","description":"\u5f53\u60a8\u4f7f\u7528 Apex \u65f6\uff0c \u4ee3\u7801\u7684\u5b89\u5168\u6027\u81f3\u5173\u91cd\u8981\u3002\u60a8\u9700\u8981\u4e3a Apex \u7c7b\u6dfb\u52a0\u7528\u6237\u6743\u9650\u5e76\u5f3a\u5236\u6267\u884c \u5171\u4eab\u89c4\u5219\u3002\u8bf7\u7ee7\u7eed\u9605\u8bfb\uff0c\u4e86\u89e3 Apex \u6258\u7ba1\u5171\u4eab\u548c \u83b7\u53d6\u4e00\u4e9b\u5b89\u5168\u63d0\u793a\u3002","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/www.ponybai.com\/?p=3666","og_locale":"zh_CN","og_type":"article","og_title":"Apex Security \u548c \u5171\u4eab - \u767d\u767d\u968f\u7b14","og_description":"\u5f53\u60a8\u4f7f\u7528 Apex \u65f6\uff0c \u4ee3\u7801\u7684\u5b89\u5168\u6027\u81f3\u5173\u91cd\u8981\u3002\u60a8\u9700\u8981\u4e3a Apex \u7c7b\u6dfb\u52a0\u7528\u6237\u6743\u9650\u5e76\u5f3a\u5236\u6267\u884c \u5171\u4eab\u89c4\u5219\u3002\u8bf7\u7ee7\u7eed\u9605\u8bfb\uff0c\u4e86\u89e3 Apex \u6258\u7ba1\u5171\u4eab\u548c \u83b7\u53d6\u4e00\u4e9b\u5b89\u5168\u63d0\u793a\u3002","og_url":"http:\/\/www.ponybai.com\/?p=3666","og_site_name":"\u767d\u767d\u968f\u7b14","article_published_time":"2023-11-30T10:44:20+00:00","article_modified_time":"2023-11-21T11:02:28+00:00","og_image":[{"width":1335,"height":1039,"url":"http:\/\/www.ponybai.com\/wp-content\/uploads\/2023\/11\/Apex\u5b89\u5168.png","type":"image\/png"}],"author":"ponybai","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"ponybai","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"8 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"http:\/\/www.ponybai.com\/?p=3666#article","isPartOf":{"@id":"http:\/\/www.ponybai.com\/?p=3666"},"author":{"name":"ponybai","@id":"http:\/\/www.ponybai.com\/#\/schema\/person\/935c7592c850c65e1e5eba4530dbf883"},"headline":"Apex Security \u548c \u5171\u4eab","datePublished":"2023-11-30T10:44:20+00:00","dateModified":"2023-11-21T11:02:28+00:00","mainEntityOfPage":{"@id":"http:\/\/www.ponybai.com\/?p=3666"},"wordCount":679,"publisher":{"@id":"http:\/\/www.ponybai.com\/#\/schema\/person\/935c7592c850c65e1e5eba4530dbf883"},"articleSection":["Apex \u5f00\u53d1\u4eba\u5458\u6307\u5357"],"inLanguage":"zh-Hans"},{"@type":"WebPage","@id":"http:\/\/www.ponybai.com\/?p=3666","url":"http:\/\/www.ponybai.com\/?p=3666","name":"Apex Security \u548c \u5171\u4eab - \u767d\u767d\u968f\u7b14","isPartOf":{"@id":"http:\/\/www.ponybai.com\/#website"},"datePublished":"2023-11-30T10:44:20+00:00","dateModified":"2023-11-21T11:02:28+00:00","description":"\u5f53\u60a8\u4f7f\u7528 Apex \u65f6\uff0c \u4ee3\u7801\u7684\u5b89\u5168\u6027\u81f3\u5173\u91cd\u8981\u3002\u60a8\u9700\u8981\u4e3a Apex \u7c7b\u6dfb\u52a0\u7528\u6237\u6743\u9650\u5e76\u5f3a\u5236\u6267\u884c \u5171\u4eab\u89c4\u5219\u3002\u8bf7\u7ee7\u7eed\u9605\u8bfb\uff0c\u4e86\u89e3 Apex \u6258\u7ba1\u5171\u4eab\u548c \u83b7\u53d6\u4e00\u4e9b\u5b89\u5168\u63d0\u793a\u3002","breadcrumb":{"@id":"http:\/\/www.ponybai.com\/?p=3666#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["http:\/\/www.ponybai.com\/?p=3666"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/www.ponybai.com\/?p=3666#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"http:\/\/www.ponybai.com\/"},{"@type":"ListItem","position":2,"name":"Apex Security \u548c \u5171\u4eab"}]},{"@type":"WebSite","@id":"http:\/\/www.ponybai.com\/#website","url":"http:\/\/www.ponybai.com\/","name":"\u767d\u767d\u968f\u7b14","description":"Salesforce\u5b98\u65b9\u8bb2\u5e08","publisher":{"@id":"http:\/\/www.ponybai.com\/#\/schema\/person\/935c7592c850c65e1e5eba4530dbf883"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/www.ponybai.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":["Person","Organization"],"@id":"http:\/\/www.ponybai.com\/#\/schema\/person\/935c7592c850c65e1e5eba4530dbf883","name":"ponybai","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"http:\/\/www.ponybai.com\/#\/schema\/person\/image\/","url":"http:\/\/www.ponybai.com\/wp-content\/uploads\/2025\/03\/cropped-Ihsans-WeChatQR.jpg","contentUrl":"http:\/\/www.ponybai.com\/wp-content\/uploads\/2025\/03\/cropped-Ihsans-WeChatQR.jpg","width":248,"height":248,"caption":"ponybai"},"logo":{"@id":"http:\/\/www.ponybai.com\/#\/schema\/person\/image\/"},"sameAs":["http:\/\/121.37.188.161"],"url":"http:\/\/www.ponybai.com\/?author=1"}]}},"_links":{"self":[{"href":"http:\/\/www.ponybai.com\/index.php?rest_route=\/wp\/v2\/posts\/3666","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.ponybai.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.ponybai.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.ponybai.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.ponybai.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3666"}],"version-history":[{"count":2,"href":"http:\/\/www.ponybai.com\/index.php?rest_route=\/wp\/v2\/posts\/3666\/revisions"}],"predecessor-version":[{"id":3669,"href":"http:\/\/www.ponybai.com\/index.php?rest_route=\/wp\/v2\/posts\/3666\/revisions\/3669"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.ponybai.com\/index.php?rest_route=\/wp\/v2\/media\/3667"}],"wp:attachment":[{"href":"http:\/\/www.ponybai.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3666"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.ponybai.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3666"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.ponybai.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3666"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}