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