X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FMSSQL.pm;h=8bcb8cb18493a9b907b56dc1e65b9e6bd2fda0fd;hb=fd05d10a0f2840dfe35e10ad848a62bcc5e816fb;hp=674d4587013b01553a07745baa1b9e34f7c9fa9d;hpb=86e68d2d59a7505fcd711c3a30dc1371d597cb76;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI/MSSQL.pm b/lib/DBIx/Class/Storage/DBI/MSSQL.pm index 674d458..8bcb8cb 100644 --- a/lib/DBIx/Class/Storage/DBI/MSSQL.pm +++ b/lib/DBIx/Class/Storage/DBI/MSSQL.pm @@ -30,14 +30,14 @@ sub insert_bulk { if ($identity_insert) { my $table = $source->from; - $self->last_dbh->do("SET IDENTITY_INSERT $table ON"); + $self->_get_dbh->do("SET IDENTITY_INSERT $table ON"); } $self->next::method(@_); if ($identity_insert) { my $table = $source->from; - $self->last_dbh->do("SET IDENTITY_INSERT $table OFF"); + $self->_get_dbh->do("SET IDENTITY_INSERT $table OFF"); } } @@ -55,10 +55,14 @@ sub insert { @pk_cols{@pk_cols} = (); my @pk_guids = grep { + $source->column_info($_)->{data_type} + && $source->column_info($_)->{data_type} =~ /^uniqueidentifier/i } @pk_cols; my @auto_guids = grep { + $source->column_info($_)->{data_type} + && $source->column_info($_)->{data_type} =~ /^uniqueidentifier/i && $source->column_info($_)->{auto_nextval} @@ -68,7 +72,7 @@ sub insert { grep { not exists $to_insert->{$_} } (@pk_guids, @auto_guids); for my $guid_col (@get_guids_for) { - my ($new_guid) = $self->last_dbh->selectrow_array('SELECT NEWID()'); + my ($new_guid) = $self->_get_dbh->selectrow_array('SELECT NEWID()'); $updated_cols->{$guid_col} = $to_insert->{$guid_col} = $new_guid; } @@ -87,7 +91,9 @@ sub _prep_for_execute { for my $col (keys %$fields) { # $ident is a result source object with INSERT/UPDATE ops - if ($ident->column_info ($col)->{data_type} =~ /^money\z/i) { + if ($ident->column_info ($col)->{data_type} + && + $ident->column_info ($col)->{data_type} =~ /^money\z/i) { my $val = $fields->{$col}; $fields->{$col} = \['CAST(? AS MONEY)', [ $col => $val ]]; } @@ -145,7 +151,7 @@ sub last_insert_id { shift->_identity } sub _svp_begin { my ($self, $name) = @_; - $self->last_dbh->do("SAVE TRANSACTION $name"); + $self->_get_dbh->do("SAVE TRANSACTION $name"); } # A new SAVE TRANSACTION with the same name releases the previous one. @@ -154,7 +160,7 @@ sub _svp_release { 1 } sub _svp_rollback { my ($self, $name) = @_; - $self->last_dbh->do("ROLLBACK TRANSACTION $name"); + $self->_get_dbh->do("ROLLBACK TRANSACTION $name"); } sub build_datetime_parser { @@ -192,6 +198,8 @@ L. =head1 IMPLEMENTATION NOTES +=head2 IDENTITY information + Microsoft SQL Server supports three methods of retrieving the IDENTITY value for inserted row: IDENT_CURRENT, @@IDENTITY, and SCOPE_IDENTITY(). SCOPE_IDENTITY is used here because it is the safest. However, it must @@ -210,6 +218,14 @@ This is more dangerous, as inserting into a table with an on insert trigger that inserts into another table with an identity will give erroneous results on recent versions of SQL Server. +=head2 bulk_insert + +Be aware that we have tried to make things as simple as possible for our users. +For MSSQL that means that when a user tries to do a populate/bulk_insert which +includes an autoincrementing column, we will try to tell the database to allow +the insertion of the autoinc column. But the user must have the db_ddladmin +role membership, otherwise you will get a fairly opaque error message. + =head1 AUTHOR See L.