Table的AOSAuthorization有以下几个枚举值可选择:
- None
- CreateDelete
- UpdateDelete
- CreateUpdateDelete
- CreateReadUpdateDelete
假设一个表的AOSAuthorization 属性被设置为CreateDelete,AOS值在确认用户有合适的权限时才执行Create和Delete操作,但是不会检查Update和Read操作。这个属性默认设置为None。在AOS通过执行表的以下方法检查操作:
- aosValidateDelete
- aosValidateInsert
- aosValidateRead
- aosValidateUpdate
可以在表上重载这些方法,AOS对每条纪录执行这些方法,所以会影响运行性能。虽然MSDN讲在AOSAuthorization设为None不做检查,但是测试发现即使把AOSAuthorization设为None,这些方法也会被调用,可以调用xRecord.skipAOSValidation(true)来忽略检查,一个表只需要调用一次,所以能在一定程度上减轻对性能的影响:
server static void JobPermAssertSkip(Args _args) { AssetTable tabAt; SkipAOSValidationPermission perm; ; ttsbegin; perm = new SkipAOSValidationPermission(); perm.assert(); tabAt.skipAosValidation(true); update_recordset tabAt setting MaintenanceInfo3 = "Useful information." where tabAt.AssetId == "goodvalue"; ttscommit; }
上面的Job虽然被放在server上运行,但是在我的测试中直接运行仍然会得到“Request for the permission of type 'SkipAOSValidationPermission' failed.”的错误,放在Class的server static方法中却是能成功运行的,MSDN的说明是SKipAOSValidationPermission.assert()需要在同一个tier一般在server tier运行,不是太明白这个解释,总之放在Class的server static方法里就没有问题了,也就是只能在server tier调用skipAOSValidation()。在调用了skipAOSValidation(true)后,表的aosValidateXXX方法就不再被调用了。
视图也有AOSAuthorization属性,它的检查只涉及到视图,和其下的Table的设置没有关系。另外如果从secured server method或者service operation操作表,表的AOSAuthorization属性被忽略,权限检查始终被执行。
详见http://msdn.microsoft.com/EN-US/library/bb278259。