using Microsoft.SqlServer.TransactSql.ScriptDom; using SQLLinter.Common; using SQLLinter.Common.Helpers; namespace SQLLinter.Infrastructure.Rules; public class ExecuteAsOwnerRule : BaseRuleVisitor { public override string Text => "Процедура должна содержать EXECUTE AS OWNER: {0}"; public override void Visit(CreateProcedureStatement node) => check(node); public override void Visit(CreateOrAlterProcedureStatement node) => check(node); public override void Visit(AlterProcedureStatement node) => check(node); private void check(ProcedureStatementBody node) { foreach (var option in node.Options) { if (option.OptionKind == ProcedureOptionKind.ExecuteAs && option is ExecuteAsProcedureOption execOpt && execOpt.ExecuteAs.ExecuteAsOption == ExecuteAsOption.Owner) { return; } } AddViolation(node.ProcedureReference.Name, SQLHelpers.ObjectGetFullName(node.ProcedureReference.Name)); } }