コード例 #1
0
        private TriggerInfo FormTrigger(Row row)
        {
            var schema      = row.GetValue(0).Value.ToString();
            var name        = row.GetValue(1).Value.ToString();
            var triggerName = new ObjectName(new ObjectName(schema), name);

            var triggerType = ((SqlNumber)row.GetValue(2).Value).ToInt32();

            var tableName = ObjectName.Parse(((SqlString)row.GetValue(3).Value).ToString());
            var eventTime = (TriggerEventTime)((SqlNumber)row.GetValue(4).Value).ToInt32();
            var eventType = (TriggerEventType)((SqlNumber)row.GetValue(5).Value).ToInt32();

            TriggerInfo triggerInfo;

            if (triggerType == ProcedureType)
            {
                var procNameString = row.GetValue(6).Value.ToString();
                var procName       = ObjectName.Parse(procNameString);
                var argsBinary     = (SqlBinary)row.GetValue(7).Value;
                var args           = DeserializeArguments(argsBinary.ToByteArray());

                triggerInfo = new ProcedureTriggerInfo(triggerName, tableName, eventTime, eventType, procName);

                if (args != null && args.Length > 0)
                {
                    foreach (var expression in args)
                    {
                        ((ProcedureTriggerInfo)triggerInfo).Arguments = args;
                    }
                }
            }
            else if (triggerType == PlSqlType)
            {
                var binary = (SqlBinary)row.GetValue(8).Value;
                var body   = binary.ToObject <PlSqlBlockStatement>();

                triggerInfo = new PlSqlTriggerInfo(triggerName, tableName, eventTime, eventType, body);
            }
            else
            {
                throw new InvalidOperationException();
            }

            triggerInfo.Status = (TriggerStatus)((SqlNumber)row.GetValue(9).Value).ToByte();

            return(triggerInfo);
        }
コード例 #2
0
ファイル: TriggerTests.cs プロジェクト: deveel/deveeldb
        private void CreateProcedureTrigger(IQuery query, ObjectName tableName)
        {
            var procedurName = ObjectName.Parse("APP.proc1");
            var body = new PlSqlBlockStatement();
            body.Declarations.Add(new DeclareVariableStatement("a", PrimitiveTypes.Integer()));
            body.Statements.Add(new AssignVariableStatement(SqlExpression.VariableReference("a"), SqlExpression.Constant(33)));
            var procedureInfo = new PlSqlProcedureInfo(procedurName, new RoutineParameter[0], body);

            query.Access().CreateObject(procedureInfo);

            var triggerName = ObjectName.Parse("APP.trigger2");
            var eventTime = TriggerEventTime.After;
            var eventType = TriggerEventType.Insert | TriggerEventType.Update;

            var triggerInfo = new ProcedureTriggerInfo(triggerName, tableName, eventTime, eventType, procedurName);
            query.Access().CreateObject(triggerInfo);
        }
コード例 #3
0
ファイル: ProcedureTrigger.cs プロジェクト: deveel/deveeldb
 public ProcedureTrigger(ProcedureTriggerInfo triggerInfo)
     : base(triggerInfo)
 {
 }
コード例 #4
0
        protected override void ExecuteStatement(ExecutionContext context)
        {
            //if (!context.User.CanCreateInSchema(TriggerName.ParentName))
            //	throw new SecurityException(String.Format("The user '{0}' cannot create in schema '{1}'.", context.User.Name, TriggerName.ParentName));

            //if (!context.User.CanExecuteProcedure(new Invoke(ProcedureName, ProcedureArguments), context.Request))
            //	throw new MissingPrivilegesException(context.User.Name, ProcedureName, Privileges.Execute);

            if (!context.DirectAccess.TableExists(TableName))
                throw new ObjectNotFoundException(TableName);

            if (context.DirectAccess.ObjectExists(DbObjectType.Trigger, TriggerName)) {
                if (!ReplaceIfExists)
                    throw new StatementException(String.Format("A trigger named '{0}' already exists.", TriggerName));

                context.DirectAccess.DropObject(DbObjectType.Trigger, TriggerName);
            }

            var triggerInfo = new ProcedureTriggerInfo(TriggerName, TableName, EventTime, EventType, ProcedureName, ProcedureArguments);

            if (Status != TriggerStatus.Unknown)
                triggerInfo.Status = Status;

            context.DirectAccess.CreateObject(triggerInfo);
            //context.DirectAccess.GrantOn(DbObjectType.Trigger, TableName, context.User.Name, PrivilegeSets.SchemaAll, true);
        }
コード例 #5
0
ファイル: TriggerManager.cs プロジェクト: deveel/deveeldb
        private TriggerInfo FormTrigger(Row row)
        {
            var schema = row.GetValue(0).Value.ToString();
            var name = row.GetValue(1).Value.ToString();
            var triggerName = new ObjectName(new ObjectName(schema), name);

            var triggerType = ((SqlNumber)row.GetValue(2).Value).ToInt32();

            var tableName = ObjectName.Parse(((SqlString) row.GetValue(3).Value).ToString());
            var eventTime = (TriggerEventTime)((SqlNumber)row.GetValue(4).Value).ToInt32();
            var eventType = (TriggerEventType) ((SqlNumber) row.GetValue(5).Value).ToInt32();

            TriggerInfo triggerInfo;

            if (triggerType == ProcedureType) {
                var procNameString = row.GetValue(6).Value.ToString();
                var procName = ObjectName.Parse(procNameString);
                var argsBinary = (SqlBinary)row.GetValue(7).Value;
                var args = DeserializeArguments(argsBinary.ToByteArray());

                triggerInfo = new ProcedureTriggerInfo(triggerName,tableName, eventTime, eventType, procName);

                if (args != null && args.Length > 0) {
                    foreach (var expression in args) {
                        ((ProcedureTriggerInfo) triggerInfo).Arguments = args;
                    }
                }
            } else if (triggerType == PlSqlType) {
                var binary = (SqlBinary) row.GetValue(8).Value;
                var body = binary.ToObject<PlSqlBlockStatement>();

                triggerInfo = new PlSqlTriggerInfo(triggerName, tableName, eventTime, eventType, body);
            } else {
                throw new InvalidOperationException();
            }

            triggerInfo.Status = (TriggerStatus) ((SqlNumber) row.GetValue(9).Value).ToByte();

            return triggerInfo;
        }
コード例 #6
0
 public ProcedureTrigger(ProcedureTriggerInfo triggerInfo)
     : base(triggerInfo)
 {
 }