I have declared the table in db.py with auth.signature, and uncommented auth.enable_record_versioning(db), but the _archive table isn't created. - Tom
On Monday, April 9, 2012 8:33:18 AM UTC-6, Massimo Di Pierro wrote: > > the signature=True only adds a signature to the auth_* tables so that if a > user creates an account for another user or creates a group, you can keep > track of who did it. > > The mything_archive table should be created by: > > auth.enable_record_versioning(db) > > This should be called after the mything table is defined. Does it work? > > On Sunday, 8 April 2012 22:08:47 UTC-5, tomt wrote: >> >> Hi, >> Thanks for your response. I deleted the database as you suggested and >> changed signature=False. The problem did go away and I was able to add >> users without the error. >> I then reverted to signature=True. While subsequent modifications did >> show the signature, the 'mything_archive' was never created. >> >> - Tom >> >> On Sunday, April 8, 2012 9:04:14 AM UTC-6, Massimo Di Pierro wrote: >>> >>> Can you try again with mysql, delete the database and replace: >>> >>> auth.define_tables(signature=True) >>> with >>> auth.define_tables(signature=False) >>> >>> Does the problem does away? It looks like it does not like the self >>> reference in auth_user. >>> >>> On Saturday, 7 April 2012 22:09:31 UTC-5, tomt wrote: >>>> >>>> Hi, >>>> >>>> I tried using your new versioning feature in trunk. >>>> I created an app using a mysql database: >>>> db = DAL('mysql://version:version@localhost/version') >>>> When I used the admin function to define a new user >>>> I received the following error: >>>> ........................................ >>>> <class 'gluon.contrib.pymysql.err.IntegrityError'> >>>> (1452, u'Cannot add or update a child row: a foreign key constraint >>>> fails >>>> (`version/auth_user`, CONSTRAINT `auth_user_ibfk_1` >>>> FOREIGN KEY (`created_by`) REFERENCES `auth_user` (`id`) ON DELETE >>>> CASCADE)') >>>> ........................................ >>>> >>>> I rebuilt the app to use sqlite instead of mysql: >>>> db = DAL('sqlite://storage.sqlite') >>>> >>>> I was then able to add a user without the error >>>> >>>> I was using MySQL client version: 5.0.84 >>>> >>>> - any suggestions? - Tom >>>> >>>> On Thursday, April 5, 2012 4:16:04 PM UTC-6, Massimo Di Pierro wrote: >>>>> >>>>> This is how it works: >>>>> >>>>> # define auth >>>>> auth = Auth(db, hmac_key=Auth.get_or_create_key()) >>>>> auth.define_tables(username=True,signature=True) >>>>> >>>>> # define your own tables like >>>>> db.define_table('mything',Field('name'),auth.signature) >>>>> >>>>> # than do: >>>>> auth.enable_record_versioning(db) >>>>> >>>>> how does it work? every table, including auth_user will have an >>>>> auth.signature including created_by, created_on, modified_by, >>>>> modified_on, >>>>> is_active fields. When a record of table mything (or any other table) is >>>>> modified, a copy of the previous record is copied into mything_archive >>>>> which references the current record. When a record is deleted, it is not >>>>> actually deleted but is_active is set to False, all records with >>>>> is_active==False are filtered out in searches except in appadmin. >>>>> >>>>> Pros: >>>>> - your app will get full record archival for auditing purposes >>>>> - could not be simpler. nothing else to do. Try with >>>>> SQLFORM.grid(db.mything) for example. >>>>> - does not break references and there is no need for uuids >>>>> - does not slow down searches because archive is done in separate >>>>> archive tables >>>>> >>>>> Cons: >>>>> - uses lots of extra memory because every version of a record is >>>>> stored (it would be more efficient to store changes only but that would >>>>> make more difficult to do auditing). >>>>> - slows down db(...).update(...) for multi record because it needs to >>>>> copy all records needing update from the original table to the archive >>>>> table. This requires selecting all the records. >>>>> >>>>> Comments? Suggestions? >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>>