【问题标题】:Error when using phpunit/dbunit with SQL Server将 phpunit/dbunit 与 SQL Server 一起使用时出错
【发布时间】:2015-06-19 13:13:54
【问题描述】:

我正在使用phpunit/dbunit测试sql server数据库,但是显示如下错误

1) 测试\集成\BlocksDaoIntegrationTest::test_insert_block PHPUnit_Extensions_Database_Operation_Exception:COMPOSITE[TRUNCATE] 操作在查询中失败: 截断表 DIGITAL_DOCUMENTS_IMAGES 使用参数:数组 ( ) [SQLSTATE[42000]:[Microsoft][SQL Server Native Client 11.0][SQL Server]无法截断表 'DIGITAL_DOCUMENTS_IMAGES',因为它被 FOREIGN KEY 约束引用。]

有人可以帮我解决吗?谢谢
(对不起英语我是巴西人)

【问题讨论】:

    标签: php sql-server testing phpunit dbunit


    【解决方案1】:

    我已经解决了扩展类 PHPUnit_Extensions_Database_Operation_Truncate 然后返回它的问题:

    操作类:

        class SQLServerTruncateOperation extends \PHPUnit_Extensions_Database_Operation_Truncate {
    
        private $reseed = "DECLARE @sql NVARCHAR(MAX);
    
            SET @sql = N'SET NOCOUNT ON;';
    
            ;WITH s(t) AS
             (
               SELECT 
                 QUOTENAME(OBJECT_SCHEMA_NAME(referenced_object_id)) 
                 + '.' + QUOTENAME(OBJECT_NAME(referenced_object_id))
              FROM sys.foreign_keys AS k
              WHERE EXISTS 
              (
                SELECT 1 FROM sys.identity_columns 
                WHERE [object_id] = k.referenced_object_id
              )
              GROUP BY referenced_object_id
            )
            SELECT @sql = @sql + N'DBCC CHECKIDENT(''' + t + ''', RESEED, 0) WITH NO_INFOMSGS;'
            FROM s;
            EXEC sp_executesql @sql;";
    
        public function execute(\PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection, \PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet) {
            $connection->getConnection()->query('EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"');
            $connection->getConnection()->query('EXEC sp_MSForEachTable "DELETE FROM ?"');
            $connection->getConnection()->query($this->reseed);
            $connection->getConnection()->query('EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"');
    
        }
    }
    

    我的测试基类:

     abstract class DBUnitAbstractTestCase extends \PHPUnit_Extensions_Database_TestCase{
    
        static private $pdo = null;
    
        private $conn = null;
    
        protected function getConnection() {
            if ($this->conn === null) {
                if (self::$pdo == null) {
                    self::$pdo = new \PDO("sqlsrv:Server=server;Database=db", "user", 'password');
                }
                $this->conn = $this->createDefaultDBConnection(self::$pdo, 'database');
            }
    
            return $this->conn;
        }
    
        public function getSetUpOperation() {
            $cascadeTruncates = TRUE; 
            return new \PHPUnit_Extensions_Database_Operation_Composite(array(
                new SQLServerTruncateOperation($cascadeTruncates),
                \PHPUnit_Extensions_Database_Operation_Factory::INSERT()
            ));
        }
    }
    

    【讨论】:

      【解决方案2】:

      问题是你在表DIGITAL_DOCUMENTS_IMAGES中有外键。
      尝试替换命令

      TRUNCATE TABLE DIGITAL_DOCUMENTS_IMAGES

      DELETE FROM DIGITAL_DOCUMENTS_IMAGES

      你会得到同样的结果 也许这可能需要一些额外的时间,但最后你会让你的桌子空着。

      使用 TRUNCATE 时有一些限制。您不能在以下表上使用 TRUNCATE TABLE:

      • 被 FOREIGN KEY 约束引用。 (您可以截断具有引用自身的外键的表。)

      • 参与索引视图。

      • 使用事务复制或合并复制发布。

      Here 你有更多关于TRUNCATEDELETE 之间区别的信息

      希望这会有所帮助。

      【讨论】:

      • DELETE_ALL PHPUnit_Extensions_Database_Operation_Exception 出现同样的问题:COMPOSITE[DELETE_ALL] operation failed on query: DELETE FROM prefix_dbtest using args: Array
      猜你喜欢
      • 2017-09-16
      • 2018-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      • 1970-01-01
      相关资源
      最近更新 更多