【问题标题】:tSQLt How can I tell if a table has been fakedtSQLt 如何判断表是否已伪造
【发布时间】:2016-12-15 14:17:10
【问题描述】:

我刚刚开始为我的数据库创建一些单元测试。

如果我伪造了一张桌子,

EXEC tSQLt.FakeTable
    @TableName = 'dbo.[My Table]',
    @Identity = 0,
    @ComputedColumns = 0,
    @Defaults = 0

我可以检查它是否是伪造的吗?

请注意,可以在 here 找到有关 FakeTable SP 的文档。

动机

我希望能够做到这一点,因为我想创建几个存储过程来填充这些伪造的表,以便我可以执行测试。 但是我不想处理伪造存储过程中的表(所以我可以多次调用它们,每次输入不同的信息)。

我不想在添加数据之前忘记伪造表格(因为这几乎肯定会导致我的测试失败)。

【问题讨论】:

    标签: sql sql-server unit-testing ssms tsqlt


    【解决方案1】:

    tSQLt 为伪造的表添加了一个扩展属性来跟踪它伪造的表。这很容易使用函数tSQLt.Private_GetOriginalTableName进行测试:

    SELECT tSQLt.Private_GetOriginalTableName('dbo','[My Table]')
    

    如果表格不是伪造的,这将返回 NULL

    如果你想做更复杂的事情,可以直接查询sys.extended_propertiestSQLt.Private_GetOriginalTableName的定义见tSQLt.class.sql脚本(在tSQLt distribution中)的内容。

    【讨论】:

    • 面部手掌。刚刚认识到 tSQLt 是一个工具,而不是 OP 的错字......
    • 是的,抱歉,我可以在我的问题中更清楚地说明我使用的是特定工具。
    • @Ed 谢谢,我会在我的代码中进行一些测试,并在我有工作后将其标记为已接受。
    • @Malrig 不是你的错,都是我的错。
    【解决方案2】:

    您可以在存储过程的开头检查该表是否存在。

    If Not Exists ( Select 1 From Sys.Objects Where [Name] = 'YOURTABLENAME' And [Type] = 'U')
      Begin
      -- Your Create Table Statement Here
      ENd
    

    根据您的 cmets,该工具必须使用模式执行类似的操作:

    Create table dbo.MisterPositive ( test int )
    Create table developers.MisterPositive (test Int )
    
    -- Both statements below work
    Select * From dbo.MisterPositive
    Select * From developers.MisterPositive
    

    -- 使用它来寻找之前的存在

    Select 1 from sys.objects
      Inner join sys.schemas ON sys.objects.schema_id = sys.schemas.schema_id
     where sys.objects.[Name] = 'MisterPositive' And sys.schemas.name = 'dbo'
    
     Select 1 from sys.objects
      Inner join sys.schemas ON sys.objects.schema_id = sys.schemas.schema_id
     where sys.objects.[Name] = 'MisterPositive' And sys.schemas.name = 'Developers'
    

    所以你的应该是

     If Not Exists ( Select 1 from sys.objects
      Inner join sys.schemas ON sys.objects.schema_id = sys.schemas.schema_id
     where sys.objects.[Name] = 'YOURTABLE' And sys.schemas.[Name] = 'tSQLt' )
       Begin
         -- create table here
       End
    

    【讨论】:

    • 这是否专门检查表是否已使用 tSQLt 工具伪造?还是只是存在一张表?
    • 如果通过伪造,您的意思是它是否存在于数据库中,那么是的,这正是该语句所做的。我不知道有一条语句会检查通过哪种方法创建了一个表。 (SSMS 或其他一些 DBMS 工具)
    • 啊,那我认为这在这种情况下不起作用。当我“伪造”一个表时,我选择了一个已经存在于数据库中的表,并且该工具将其替换为一个同名的空表(不确定它是如何工作的)。所以在我伪造它之前,该表已经存在。
    • 我所知道的任何 DBMS 中都不能存在两个具有相同名称的表。解决这个问题的唯一方法是使用不同的模式所有者。请参阅我的更新答案。
    • @Malrig 我更新了我的答案,以便您也可以在需要时使用自己的代码。 (工具外)
    猜你喜欢
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 2011-05-19
    • 1970-01-01
    相关资源
    最近更新 更多