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?
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>

Reply via email to