繁体   English   中英

在SQL Server中使用phpunit / dbunit时出错

[英]Error when using phpunit/dbunit with SQL Server

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

1)Tests \\ Integration \\ BlocksDaoIntegrationTest :: test_insert_block PHPUnit_Extensions_Database_Operation_Exception:COMPOSITE [TRUNCATE]操作在查询时失败:使用args截断表DIGITAL_DOCUMENTS_IMAGES:数组()[SQLSTATE [42000]:[Microsoft] [SQL Server 1.0]无法截断表“ DIGITAL_DOCUMENTS_IMAGES”,因为它已被FOREIGN KEY约束引用。]

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

我已经解决了扩展类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()
        ));
    }
}

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

TRUNCATE TABLE DIGITAL_DOCUMENTS_IMAGES

DELETE FROM DIGITAL_DOCUMENTS_IMAGES

您将获得相同的结果,也许会花费一些时间,但最后您将表空了。

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

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

  • 参与索引视图。

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

在这里,TRUNCATE有关TRUNCATEDELETE之间的区别的更多信息。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM