mysqlaudit 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/mysqlaudit +15 -13
- data/lib/mysqlaudit/audit.rb +42 -25
- data/lib/mysqlaudit/version.rb +1 -1
- metadata +2 -2
data/bin/mysqlaudit
CHANGED
@@ -53,25 +53,27 @@ end
|
|
53
53
|
|
54
54
|
command :rollback do |c|
|
55
55
|
c.description = 'Rollback transaction cath in audit table'
|
56
|
-
c.syntax = 'audits rollback --host 127.0.0.1 --user root [--pass admin] --schema sakila --table foo --statement
|
56
|
+
c.syntax = 'audits rollback --host 127.0.0.1 --user root [--pass admin] --schema sakila --table foo [--statement all]'
|
57
57
|
c.option '--host STRING', String, 'Host'
|
58
58
|
c.option '--user STRING', String, 'User'
|
59
59
|
c.option '--pass STRING', String, 'Password'
|
60
60
|
c.option '--schema STRING', String, 'Schema name'
|
61
61
|
c.option '--table STRING', String, 'Table name'
|
62
|
-
c.option '--statement STRING', String, 'Statement operation: insert, update, delete'
|
62
|
+
c.option '--statement STRING', String, 'Statement operation: all, insert, update, delete'
|
63
63
|
c.action do |args, options|
|
64
|
-
if
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
64
|
+
if options.statement.nil?
|
65
|
+
options.statement = :all
|
66
|
+
end
|
67
|
+
|
68
|
+
if [:all, :insert, :update, :delete].include? options.statement.to_sym
|
69
|
+
Mysqlaudit::Actions.new({host: options.host,
|
70
|
+
user: options.user,
|
71
|
+
password: options.pass,
|
72
|
+
schema: options.schema,
|
73
|
+
table: options.table,
|
74
|
+
statement: options.statement.to_sym}).rollback
|
75
|
+
else
|
76
|
+
puts "Invalid values on argument: --statement."
|
75
77
|
end
|
76
78
|
end
|
77
79
|
end
|
data/lib/mysqlaudit/audit.rb
CHANGED
@@ -77,7 +77,7 @@ SQL
|
|
77
77
|
end
|
78
78
|
|
79
79
|
def get_columns(table)
|
80
|
-
sql
|
80
|
+
sql = "SELECT column_name AS name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='#{$schema}' AND TABLE_NAME='#{table}' AND column_key <> 'PRI';"
|
81
81
|
sql_result = @mysql.query(sql)
|
82
82
|
sql_result.map { |table| table['name']}
|
83
83
|
end
|
@@ -124,40 +124,57 @@ SQL
|
|
124
124
|
end
|
125
125
|
|
126
126
|
def has_trigger(table, actionName)
|
127
|
-
sql
|
127
|
+
sql = "SELECT true AS has FROM information_schema.triggers WHERE trigger_schema = '#{$schema}' AND trigger_name = 'audit_#{table}_#{actionName}';"
|
128
128
|
@mysql.query(sql).count == 1
|
129
129
|
end
|
130
130
|
|
131
|
-
def
|
131
|
+
def insert(table)
|
132
|
+
sql = "SELECT CONCAT('/* ', trigger_at, ' */ DELETE FROM #{table} WHERE id = ', MAX(primary_key),';') AS `row` "
|
133
|
+
sql << "FROM audits "
|
134
|
+
sql << "WHERE `type` = 'I' AND `table` = '#{table}' GROUP BY primary_key "
|
135
|
+
sql << "ORDER BY trigger_at, primary_key, `column` ASC;"
|
136
|
+
end
|
137
|
+
|
138
|
+
def update(table)
|
139
|
+
sql = "SELECT CONCAT('/* ', trigger_at, ' */ UPDATE users SET ', `column`, ' = ', QUOTE(old), ' WHERE id = ', primary_key, ';') AS `row`"
|
140
|
+
sql << "FROM audits WHERE `type` = 'U' AND `table` = '#{table}' ORDER BY trigger_at, primary_key, `column` ASC;"
|
141
|
+
end
|
142
|
+
|
143
|
+
def delete(table)
|
132
144
|
columns = get_columns(table)
|
133
145
|
key = get_primary_key(table)
|
134
146
|
|
147
|
+
sql = "SELECT CONCAT('/* ', trigger_at, ' */ INSERT INTO #{table} (#{key}, #{columns.join(', ')}) VALUES (', primary_key, ', ', "
|
148
|
+
columns.each do | column |
|
149
|
+
sql << " QUOTE(MAX(IF(`column` = '#{column}', `old`, NULL))), ', ', "
|
150
|
+
end
|
151
|
+
sql = sql.chomp(" ', ', ")
|
152
|
+
sql << "');'"
|
153
|
+
sql << ") AS `row` FROM audits WHERE `type` = 'D' AND `table` = '#{table}' GROUP BY primary_key ORDER BY trigger_at, primary_key, `column` ASC;"
|
154
|
+
end
|
155
|
+
|
156
|
+
def rollback(table, statement)
|
157
|
+
sqls = []
|
158
|
+
|
135
159
|
case statement
|
160
|
+
when :all
|
161
|
+
sqls << insert(table)
|
162
|
+
sqls << update(table)
|
163
|
+
sqls << delete(table)
|
136
164
|
when :insert
|
137
|
-
|
138
|
-
SELECT CONCAT('/* ', trigger_at, ' */ DELETE FROM #{table} WHERE id = ', MAX(primary_key),';') AS `row`
|
139
|
-
FROM audits
|
140
|
-
WHERE `type` = 'I'
|
141
|
-
AND `table` = '#{table}'
|
142
|
-
GROUP BY primary_key
|
143
|
-
ORDER BY trigger_at, primary_key, `column` ASC;
|
144
|
-
SQL
|
145
|
-
when :delete
|
146
|
-
sql = "SELECT CONCAT('/* ', trigger_at, ' */ INSERT INTO #{table} (#{key}, #{columns.join(', ')}) VALUES (', primary_key, ', ', "
|
147
|
-
columns.each do | column |
|
148
|
-
sql << " QUOTE(MAX(IF(`column` = '#{column}', `old`, NULL))), ', ', "
|
149
|
-
end
|
150
|
-
sql = sql.chomp(" ', ', ")
|
151
|
-
sql << "');'"
|
152
|
-
sql << ") AS `row` FROM audits WHERE `type` = 'D' AND `table` = '#{table}' GROUP BY primary_key ORDER BY trigger_at, primary_key, `column` ASC;"
|
165
|
+
sqls << insert(table)
|
153
166
|
when :update
|
154
|
-
|
155
|
-
|
167
|
+
sqls << update(table)
|
168
|
+
when :delete
|
169
|
+
sqls << delete(table)
|
156
170
|
end
|
157
171
|
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
172
|
+
sqls.each do | sql |
|
173
|
+
sql_result = @mysql.query(sql)
|
174
|
+
sql_result.each(:as => :array) do |row|
|
175
|
+
puts row
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
162
179
|
end
|
163
180
|
end
|
data/lib/mysqlaudit/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mysqlaudit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-07-
|
12
|
+
date: 2013-07-24 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: MySQL tool for audit all tables with triggers.
|
15
15
|
email: nicola51980@gmail.com
|